Java调用阿里云对象存储OSS
- 一、准备
- 二、新建Bucket
- 三、AccessKey 管理
- 四、开发
- 4.1、maven
- 4.2、上传文件
- 4.2.1、简单上传
- 4.2.1.1、流式上传
- 4.2.1.2、文件上传
- 4.2.2、追加上传
- 4.2.3、断点续传上传
- 4.2.4、进度条
- 4.2.5、上传回调
- 4.3、下载文件
- 4.3.1、流式下载
- 4.3.2、下载到本地文件
- 4.3.3、进度条
一、准备
没有注册阿里云账号的去注册账号并实名
没有开通对象存储OSS,开通对象存储OSS
阿里云官网:https://www.aliyun.com/
OSS控制台:https://oss.console.aliyun.com/
新人福利会场:https://www.aliyun.com/1111/new?userCode=r85k1yor
官方文档:https://help.aliyun.com/product/31815.html
二、新建Bucket
三、AccessKey 管理
请记住申请完子用户AccessKey后不要立即关闭窗口,先将申请的AccessKeySecret进行保存,因为关闭后,再也没办法进行查看AccessKeySecret,只能查看到AccessKeyId。
四、开发
4.1、maven
<dependencies>
<!--aliyun-oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
4.2、上传文件
在OSS中,操作的基本数据单元是文件(Object)。OSS Java SDK提供了以下几种文件上传方式:
- 简单上传:包括流式上传和文件上传。最大不能超过5GB。
- 表单上传:最大不能超过5GB。
- 追加上传:最大不能超过5GB。
- 断点续传上传:支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。
- 分片上传:当文件较大时,可以使用分片上传,最大不能超过48.8TB。
上传过程中,您可以设置文件元信息,也可以通过进度条功能查看上传进度。上传完成后,您还可以进行上传回调。
4.2.1、简单上传
简单上传是指通过PutObject方法上传单个文件(Object)。简单上传包括流式上传和文件上传,流式上传使用InputStream作为OSS文件的数据源,文件上传使用本地文件作为OSS文件的数据源。本文介绍如何使用流式上传和文件上传方式上传文件。
4.2.1.1、流式上传
使用流式上传,您可以将数据流上传到OSS文件。文件和文件夹不在在时,可以自动创建。
上传字符串
public class OssUploadString {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 填写字符串。
String content = "Hello OSS";
// 创建PutObjectRequest对象。
// 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
PutObjectRequest putObjectRequest = new PutObjectRequest("java521", "testData/test01.txt", new ByteArrayInputStream(content.getBytes()));
// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
//ObjectMetadata metadata = new ObjectMetadata();
//metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
//metadata.setObjectAcl(CannedAccessControlList.Private);
//putObjectRequest.setMetadata(metadata);
// 上传文件。
ossClient.putObject(putObjectRequest);
// 关闭OSSClient。
ossClient.shutdown();
}
}
上传Byte数组
public class OssUploadByteArray {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 填写Byte数组。
byte[] content = "Hello, Mr. Xu".getBytes();
// 依次填写Bucket名称、Object完整路径、。Object完整路径中不能包含Bucket名称。
ossClient.putObject("java521", "testData/test02.txt", new ByteArrayInputStream(content));
// 关闭OSSClient。
ossClient.shutdown();
}
}
上传网络流
public class OssUploadNetworkStram {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 填写Byte数组。
byte[] content = "Hello, Mr. Xu".getBytes();
// 填写网络流地址。
InputStream inputStream = null;
try {
inputStream = new URL("https://amap.java521.com/").openStream();
} catch (IOException e) {
e.printStackTrace();
}
// 依次填写Bucket名称、Object完整路径、。Object完整路径中不能包含Bucket名称。
ossClient.putObject("java521", "testData/test03.txt", inputStream);
// 关闭OSSClient。
ossClient.shutdown();
}
}
上传文件流
public class OssUploadFileStream {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
InputStream inputStream = null;
try {
inputStream = new FileInputStream("D:\\Java\\test.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 依次填写Bucket名称、Object完整路径、。Object完整路径中不能包含Bucket名称。
ossClient.putObject("java521", "testData/test04.txt", inputStream);
// 关闭OSSClient。
ossClient.shutdown();
}
}
4.2.1.2、文件上传
public class OssUploadFile {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 创建PutObjectRequest对象。
// 依次填写Bucket名称、上传到oss的完整路径(包括路径和文件名)、本地文件的完整路径。
// 如果未指定本地路径,则默认从程序所属项目对应本地路径中上传文件。
PutObjectRequest putObjectRequest = new PutObjectRequest("java521", "testData/test05.txt", new File("D:\\Java\\test.txt"));
// 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
//ObjectMetadata metadata = new ObjectMetadata();
//metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
//metadata.setObjectAcl(CannedAccessControlList.Private);
//putObjectRequest.setMetadata(metadata);
// 上传文件。
ossClient.putObject(putObjectRequest);
// 关闭OSSClient。
ossClient.shutdown();
}
}
4.2.2、追加上传
追加上传是指通过AppendObject方法在已上传的追加类型文件(Appendable Object)末尾直接追加内容。
使用限制
- 如果文件不存在,则调用AppendObject接口会创建一个可追加类型的文件。
- 如果文件已存在,且为可追加类型文件时,若设置的追加位置和文件当前长度不等,则抛出PositionNotEqualToLength异常。如果文件已存在,且为不可追加类型文件时,则抛出ObjectNotAppendable异常。
- 追加类型的文件暂不支持CopyObject操作。
public class OssAppendUpload {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
String content1 = "Hello World \n";
String content2 = "Hello OSS \n";
String content3 = "Hello, Mr. Xu \n";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ObjectMetadata meta = new ObjectMetadata();
// 指定上传的内容类型。
meta.setContentType("text/plain");
// 通过AppendObjectRequest设置多个参数。
AppendObjectRequest appendObjectRequest = new AppendObjectRequest("java521", "testData/test07.txt", new ByteArrayInputStream(content1.getBytes()), meta);
// 通过AppendObjectRequest设置单个参数。
// 设置Bucket名称。
//appendObjectRequest.setBucketName("<yourBucketName>");
// 设置Object名称。即不包含Bucket名称在内的Object的完整路径,例如example/test.txt。
//appendObjectRequest.setKey("<yourObjectName>");
// 设置待追加的内容。有两种可选类型:InputStream类型和File类型。这里为InputStream类型。
//appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
// 设置待追加的内容。有两种可选类型:InputStream类型和File类型。这里为File类型。
//appendObjectRequest.setFile(new File("<yourLocalFile>"));
// 指定文件的元信息,第一次追加时有效。
//appendObjectRequest.setMetadata(meta);
// 第一次追加。
// 设置文件的追加位置。
appendObjectRequest.setPosition(0L);
AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
// 文件的64位CRC值。此值根据ECMA-182标准计算得出。
System.out.println(appendObjectResult.getObjectCRC());
// 第二次追加。
// nextPosition指明下一次请求中应当提供的Position,即文件当前的长度。
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
appendObjectResult = ossClient.appendObject(appendObjectRequest);
// 第三次追加。
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
appendObjectResult = ossClient.appendObject(appendObjectRequest);
// 关闭OSSClient。
ossClient.shutdown();
}
}
4.2.3、断点续传上传
通过断点续传上传的方式将文件上传到OSS前,您可以指定断点记录点。上传过程中,如果出现网络异常或程序崩溃导致文件上传失败时,将从断点记录处继续上传未上传完成的部分。
参数
您可以通过ossClient.uploadFile方法实现断点续传上传。此方法的uploadFileRequest请求包含的参数请参见下表。
参数 | 描述 |
BucketName | 存储空间名称。 |
Key | 上传到OSS的文件名称。 |
UploadFile | 待上传的本地文件路径。 |
TaskNum | 上传并发线程数,默认值为1。 |
PartSize | 上传的分片大小,单位为Byte,取值范围为100 KB~5 GB。默认值为100 KB。 |
EnableCheckpoint | 是否开启断点续传功能,默认关闭。 |
CheckpointFile | 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中,如果某一分片上传失败,再次上传时会根据文件中记录的点继续上传。上传完成后,该文件会被删除。如果未设置该值,默认与待上传的本地文件同路径,名称为${uploadFile}.ucp。 |
Callback |
public class OssBreakpointUpload {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ObjectMetadata meta = new ObjectMetadata();
// 指定上传的内容类型。
meta.setContentType("text/plain");
// 文件上传时设置访问权限ACL。
// meta.setObjectAcl(CannedAccessControlList.Private);
// 通过UploadFileRequest设置多个参数。
// 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
UploadFileRequest uploadFileRequest = new UploadFileRequest("java521", "testData/test08.txt");
// 通过UploadFileRequest设置单个参数。
// 填写Bucket名称。
//uploadFileRequest.setBucketName("examplebucket");
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
//uploadFileRequest.setKey("exampleobject.txt");
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
uploadFileRequest.setUploadFile("D:\\Java\\test.txt");
// 指定上传并发线程数,默认值为1。
uploadFileRequest.setTaskNum(5);
// 指定上传的分片大小。
uploadFileRequest.setPartSize(1 * 1024 * 1024);
// 开启断点续传,默认关闭。
uploadFileRequest.setEnableCheckpoint(true);
// 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中。
uploadFileRequest.setCheckpointFile("yourCheckpointFile");
// 文件的元数据。
uploadFileRequest.setObjectMetadata(meta);
// 设置上传成功回调,参数为Callback类型。
//uploadFileRequest.setCallback("yourCallbackEvent");
// 断点续传上传。
try {
ossClient.uploadFile(uploadFileRequest);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
// 关闭OSSClient。
ossClient.shutdown();
}
}
4.2.4、进度条
进度条用于指示上传或下载文件的进度。本文以ossClient.putObject方法为例,介绍如何使用进度条。
public class PutObjectProgressListener implements ProgressListener {
private long bytesWritten = 0;
private long totalBytes = -1;
private boolean succeed = false;
@Override
public void progressChanged(ProgressEvent progressEvent) {
long bytes = progressEvent.getBytes();
ProgressEventType eventType = progressEvent.getEventType();
switch (eventType) {
case TRANSFER_STARTED_EVENT:
System.out.println("Start to upload......");
break;
case REQUEST_CONTENT_LENGTH_EVENT:
this.totalBytes = bytes;
System.out.println(this.totalBytes + " bytes in total will be uploaded to OSS");
break;
case REQUEST_BYTE_TRANSFER_EVENT:
this.bytesWritten += bytes;
if (this.totalBytes != -1) {
int percent = (int)(this.bytesWritten * 100.0 / this.totalBytes);
System.out.println(bytes + " bytes have been written at this time, upload progress: " + percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
} else {
System.out.println(bytes + " bytes have been written at this time, upload ratio: unknown" + "(" + this.bytesWritten + "/...)");
}
break;
case TRANSFER_COMPLETED_EVENT:
this.succeed = true;
System.out.println("Succeed to upload, " + this.bytesWritten + " bytes have been transferred in total");
break;
case TRANSFER_FAILED_EVENT:
System.out.println("Failed to upload, " + this.bytesWritten + " bytes have been transferred");
break;
default:
break;
}
}
public boolean isSucceed() {
return succeed;
}
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
String bucketName = "java521";
String objectName = "testData/test09.zip";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 上传文件的同时指定了进度条参数。
ossClient.putObject(new PutObjectRequest(bucketName, objectName, new File("D:\\Java\\jdk1.8.0_162\\src.zip")).
<PutObjectRequest>withProgressListener(new PutObjectProgressListener()));
} catch (Exception e) {
e.printStackTrace();
}
// 关闭OSSClient。
ossClient.shutdown();
}
}
4.2.5、上传回调
public class OssUploadCallBack {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
String bucketName = "java521";
String objectName = "testData/test10.txt";
// 您的回调服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。
String callbackUrl = "http://oss-demo.aliyuncs.com:23450";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String content = "Hello OSS";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
// 上传回调参数。
Callback callback = new Callback();
callback.setCallbackUrl(callbackUrl);
//(可选)设置回调请求消息头中Host的值,即您的服务器配置Host的值。
// callback.setCallbackHost("yourCallbackHost");
// 设置发起回调时请求body的值。
callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}");
// 设置发起回调请求的Content-Type。
callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);
// 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始。
callback.addCallbackVar("x:var1", "value1");
callback.addCallbackVar("x:var2", "value2");
putObjectRequest.setCallback(callback);
PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
// 读取上传回调返回的消息内容。
byte[] buffer = new byte[1024];
try {
putObjectResult.getResponse().getContent().read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
try {
putObjectResult.getResponse().getContent().close();
} catch (IOException e) {
e.printStackTrace();
}
// 关闭OSSClient。
ossClient.shutdown();
}
}
其它方式略
4.3、下载文件
4.3.1、流式下载
当下载的文件太大或者一次性下载耗时太长时,您可以通过流式下载,一次处理部分内容,直到完成文件的下载。
ossObject对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。关闭方法如下:
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
ossObject.close();
public class OssStreamDownload {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 填写Bucket名称。
String bucketName = "java521";
// 填写Object的完整路径。Object完整路径中不能包含Bucket名称。 文件必须在oss中在在
String objectName = "testData/test10.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
// 读取文件内容。
System.out.println("Object content:");
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
while (true) {
String line = null;
try {
line = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if (line == null) break;
System.out.println("\n" + line);
}
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
// 关闭OSSClient。
ossClient.shutdown();
}
}
4.3.2、下载到本地文件
public class OssDownloadLocal {
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 填写Bucket名称。
String bucketName = "java521";
// 填写Object的完整路径。Object完整路径中不能包含Bucket名称。 文件必须在oss中在在
String objectName = "testData/test10.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
// 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File("D:\\Java\\downloadFile.txt"));
// 关闭OSSClient。
ossClient.shutdown();
}
}
4.3.3、进度条
进度条用于指示上传或下载文件的进度。本文以ossClient.getObject方法为例,介绍如何使用进度条。
public class GetObjectProgressListener implements ProgressListener {
private long bytesRead = 0;
private long totalBytes = -1;
private boolean succeed = false;
@Override
public void progressChanged(ProgressEvent progressEvent) {
long bytes = progressEvent.getBytes();
ProgressEventType eventType = progressEvent.getEventType();
switch (eventType) {
case TRANSFER_STARTED_EVENT:
System.out.println("Start to download......");
break;
case RESPONSE_CONTENT_LENGTH_EVENT:
this.totalBytes = bytes;
System.out.println(this.totalBytes + " bytes in total will be downloaded to a local file");
break;
case RESPONSE_BYTE_TRANSFER_EVENT:
this.bytesRead += bytes;
if (this.totalBytes != -1) {
int percent = (int) (this.bytesRead * 100.0 / this.totalBytes);
System.out.println(bytes + " bytes have been read at this time, download progress: " +
percent + "%(" + this.bytesRead + "/" + this.totalBytes + ")");
} else {
System.out.println(bytes + " bytes have been read at this time, download ratio: unknown" +
"(" + this.bytesRead + "/...)");
}
break;
case TRANSFER_COMPLETED_EVENT:
this.succeed = true;
System.out.println("Succeed to download, " + this.bytesRead + " bytes have been transferred in total");
break;
case TRANSFER_FAILED_EVENT:
System.out.println("Failed to download, " + this.bytesRead + " bytes have been transferred");
break;
default:
break;
}
}
public boolean isSucceed() {
return succeed;
}
public static void main(String[] args) {
// Endpoint以北京为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "LTAI5tKmStGAf3Qz********";
String accessKeySecret = "GgMEjdeUokQ7OscWye1wTZ********";
// 填写Bucket名称。
String bucketName = "java521";
// 填写Object的完整路径。Object完整路径中不能包含Bucket名称。 文件必须在oss中在在
String objectName = "testData/test09.zip";
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 下载文件的同时指定了进度条参数。
ossClient.getObject(new GetObjectRequest(bucketName, objectName).
<GetObjectRequest>withProgressListener(new GetObjectProgressListener()),
new File("D:\\Java\\srcTest.zip"));
} catch (Exception e) {
e.printStackTrace();
}
// 关闭OSSClient。
ossClient.shutdown();
}
}
其它方式略