发表于: 2018-06-10 21:43:09
1 839
今日完成:
1.阿里云OSS使用和调用接口
1.1 阿里云对象存储服务(Object Storage Service,简称OSS)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。
阿里云OSS将数据文件以对象(object)的形式上传到存储空间(bucket)中。您可以进行以下操作:
- 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。
- 通过获取已上传文件的地址进行文件的分享和下载。
- 通过修改存储空间或文件的属性或元信息来设置相应的访问权限。
- 在阿里云管理控制台执行基本和高级OSS任务。
- 使用阿里云开发工具包或直接在应用程序中进行RESTful , API调用执行基本和高级OSS任务。
1.2 调用接口
首先导入相关依赖包jdom使用1.1版本,过高会不兼容,出现异常
<!--阿里云OSS服务-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/libs/aliyun/aliyun-sdk-oss-2.8.2.jar</systemPath>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss-javadoc</artifactId>
<version>2.8.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/libs/aliyun/aliyun-sdk-oss-2.8.2-javadoc.jar</systemPath>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss-java-source</artifactId>
<version>2.8.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/libs/aliyun/aliyun-sdk-oss-2.8.2-sources.jar</systemPath>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
编写OSS服务实现类(文件上传,文件流上传下载,断点续传,断点续传下载)
package service.impl;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.*;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import pojo.ShortMessage;
import javax.annotation.Resource;
import java.io.*;
import java.net.URL;
/**
* 阿里云OSS上传下载文件
*/
@Service
public class OssService {
@Resource
private
ShortMessage shortMessage;
private Logger log = Logger.getLogger(OssService.class);
private OSSClient getOssClient(){
// endpoint以杭州为例,其它region请按实际情况填写。
String endpoint = "http://oss-cn-shanghai.aliyuncs.com";
// 创建OSSClient实例,实例必须在中括号内使用
return new OSSClient(endpoint,shortMessage.getAccessKeyId(),shortMessage.getAccessKeySecret());
}
/**
* 新建存储空间
* @param bucketName 存储空间名
* @return bool
*/
public boolean createBucket(String bucketName){
boolean bool=false;
OSSClient ossClient =getOssClient();
try{
ossClient.createBucket(bucketName);
bool = true;
}catch (Exception e){
log.info("创建Bucket失败");
e.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return bool;
}
/**
* 新建文件夹
* @param bucketName bucket
* @param dir 文件夹,以"/"结尾 "dir1/dir2/dir3/"
* @return bool
*/
public boolean createDirectory(String bucketName,String dir){
boolean bool =false;
OSSClient ossClient =getOssClient();
try {
ossClient.putObject(bucketName,dir, new ByteArrayInputStream(new byte[0]));
bool =true;
}catch (Exception e){
log.info("创建OSS文件夹异常");
e.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return bool;
}
/**
* 上传文件流(流式上传)
* @param bucketName 存储空间名
* @param objectName key文件名(ant.png)
* @param localFile value文件本体 (文件全路径如:D:\\image\\cake.jpg)
*/
public String uploadFileStream(String bucketName,String objectName,String localFile){
String resultStr ="";
OSSClient ossClient =getOssClient();
try{
InputStream inputStream = new FileInputStream(new File(localFile));
//上传文件
PutObjectResult putObjectResult = ossClient.putObject(bucketName,objectName,inputStream);
//上传后的文件MD5数字唯一签名
resultStr = putObjectResult.getETag();
log.info("上传文件流成功解析成MD5数字唯一签名:"+resultStr);
}catch (Exception e){
log.info("上传文件流异常");
e.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return resultStr;
}
/**
* 上传网络流(流式上传)
* @param bucketName bucket
* @param objectName objectName
* @param url url
* @return 上传后的文件MD5数字唯一签名
* @throws IOException i/o
*/
public String uploadUrlStream(String bucketName,String objectName,String url) throws IOException {
String resultStr ="";
OSSClient ossClient =getOssClient();
try{
InputStream inputStream = new URL(url).openStream();
//上传文件
PutObjectResult putObjectResult = ossClient.putObject(bucketName,objectName,inputStream);
//上传后的文件MD5数字唯一签名
resultStr = putObjectResult.getETag();
log.info("上传网络流成功解析成MD5数字唯一签名:"+resultStr);
}catch (Exception e){
log.info("上传网络流异常");
e.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return resultStr;
}
/**
* 上传文件
* @param bucketName bucket
* @param objectName 文件名
* @param localFile 本地文件
* @return
*/
public String uploadFile(String bucketName,String objectName,String localFile){
String resultStr ="";
OSSClient ossClient =getOssClient();
try{
//上传文件
PutObjectResult putObjectResult = ossClient.putObject(bucketName,objectName,new File(localFile));
//上传后的文件MD5数字唯一签名
resultStr = putObjectResult.getETag();
log.info("上传文件成功解析成MD5数字唯一签名:"+resultStr);
}catch (Exception e){
log.info("上传文件异常");
e.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return resultStr;
}
/**
* 断点续传文件
* @param bucketName bucket
* @param objectName objectName
* @param localFile localFile
* @return bool
*/
public boolean uploadMultipartFile(String bucketName,String objectName,String localFile){
boolean bool = false;
OSSClient ossClient =getOssClient();
try {
ObjectMetadata meta = new ObjectMetadata();
// 指定上传的内容类型。
meta.setContentType("text/plain");
// 设置断点续传请求。
UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName, objectName);
// 指定上传的本地文件,必选参数。
uploadFileRequest.setUploadFile(localFile);
// 指定上传并发线程数,默认为1。
uploadFileRequest.setTaskNum(5);
// 指定上传的分片大小,从100KB到5GB,单位是Byte,默认为100K。
uploadFileRequest.setPartSize(1024 * 1024);
// 开启断点续传,默认关闭。
uploadFileRequest.setEnableCheckpoint(true);
//本地记录分片上传的结果。开启断点续传时,需要在本地记录分片上传的结果,如果上传过程中某一分片上传失败,
// 再次上传时会从Checkpoint文件中记录的点继续上传,这要求再次调用时要指定与上次相同的Checkpoint文件。
// 上传完成后,Checkpoint文件会被删除。默认与待上传的本地文件同目录,为uploadFile.ucp。
uploadFileRequest.setCheckpointFile("uploadFile.ucp");
//Object的元数据。
uploadFileRequest.setObjectMetadata(meta);
//设置Callback,上传成功后的回调,Callback类型的。
// uploadFileRequest.setCallback("<yourCallbackEvent>");
// 断点续传上传。
ossClient.uploadFile(uploadFileRequest);
bool =true;
} catch (Throwable throwable) {
throwable.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return bool;
}
/**
* 流式下载(暂时不知道怎么用)
* @param bucketName b
* @param objectName o
* @return bool
*/
public boolean downloadFileStream(String bucketName,String objectName){
boolean bool =false;
OSSClient ossClient =getOssClient();
try {
//ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 读取文件内容。
System.out.println("Object content:");
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
while (true) {
String line = reader.readLine();
if (line == null) break;
System.out.println("\n" + line);
}
//数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
reader.close();
bool = true;
} catch (IOException e) {
e.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return bool;
}
/**
* 下载到本地
* @param bucketName bucket
* @param objectName oname
* @param localFile localFile
* @return bool
*/
public boolean download2Local(String bucketName,String objectName,String localFile){
boolean bool =false;
OSSClient ossClient =getOssClient();
try {
// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
ossClient.getObject(new GetObjectRequest(bucketName, objectName),new File(localFile));
bool =true;
}catch (Exception e){
log.info("下载到本地异常:"+e.getMessage());
e.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return bool;
}
/**
* 列举指定存储空间下的文档。默认列举100个文件。
* @param bucketName 指定存储空间
*/
public void listObjects(String bucketName){
OSSClient ossClient =getOssClient();
//ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
ObjectListing objectListing = ossClient.listObjects(bucketName);
//objectListing.getObjectSummaries获取所有Object的描述信息。
for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println(" - " + objectSummary.getKey() + " " +
"(size = " + objectSummary.getSize() + ")");
}
// 关闭Client。
ossClient.shutdown();
}
/**
* 删除文件
* @param bucketName 指定存储空间
* @param objectName 指定文件名(ant.png)
* @return bool
*/
public boolean deleteObject(String bucketName,String objectName){
boolean isDelete =false;
OSSClient ossClient =getOssClient();
try {
ossClient.deleteObject(bucketName, objectName);
isDelete =true;
}catch (Exception e){
e.printStackTrace();
}
// 关闭Client。
ossClient.shutdown();
return isDelete;
}
}
测试:
/**
* 文件上传下载
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-mybatis.xml")
public class OssServiceTest {
@Autowired
OssService ossService;
@Test
public void test1() throws IOException {
String bucketName = "";
String localFile = "E:\\images\\shinto.png";
// ossDemo.putObject("lichunyu-data","ant",content);
// ossDemo.createBucket(content);
// System.out.println(ossDemo.putObject(content,"ant.png",object));
// System.out.println(ossDemo.deleteObject(content,"ant"));
// ossDemo.download2Local(content,"ant.png","D:");
System.out.println(ossService.uploadFile(bucketName,"dir/shinto.png",localFile));
// System.out.println(ossDemo.uploadFileStream(bucketName,"email.png",localFile));
// ossDemo.createDirectory(bucketName,"dir/");
// ossDemo.uploadMultipartFile(bucketName,"dir/ant.png",localFile);
// System.out.println(ossDemo.download2Local(bucketName,"ant.png","E:/images/ant.png"));
// System.out.println(ossDemo.downloadFileStream(bucketName,"ant.png"));
ossService.listObjects(bucketName);
}
}
结果为可以使用实现类功能:
明日计划:
把短信、邮箱和图片上传下载功能集成到学员报名系统中
遇到的问题:
OSS 依赖包jdom不能使用高版本,否则会出异常
今日完成:
调用OSS接口,完成文件的上传和下载
评论