下载

更新时间:2025-08-18 15:54:18

WOS Java SDK 提供了丰富的对象下载接口,您可以通过 WosClient.getObject 下载对象。

1. 流式下载

以下代码展示了如何进行流式下载:

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

WosObject wosObject = WosClient.getObject("bucketname", "objectname");

// 读取对象内容
System.out.println("Object content:");
InputStream input = wosObject.getObjectContent();
byte[] b = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
int len;
while ((len=input.read(b)) != -1){
    bos.write(b, 0, len);
}
System.out.println(new String(bos.toByteArray()));
bos.close();
input.close();

说明:

  • WosClient.getObject 返回的 WosObject 实例包含对象所在的空间、对象名、对象属性、对象输入流等信息。
  • 可通过操作对象输入流将对象内容读取到本地文件或者内存中。

须知:

  • 通过 WosObject.getObjectContent 获取的对象输入流一定要显式关闭,否则会造成资源泄露。

2. 范围下载

如果只需要下载对象的部分数据,可以使用范围下载功能,下载指定范围的数据。如果指定的下载范围是0~1000,则返回第0到第1000个字节的数据,包括第1000个,共1001字节的数据,即[0, 1000]。如果指定的范围无效,则返回整个对象的数据。以下代码展示了如何进行范围下载:

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
// 指定开始和结束范围
request.setRangeStart(0l);
request.setRangeEnd(1000l);
WosObject wosObject = wosClient.getObject(request);

// 读取数据
byte[] buf = new byte[1024];
InputStream in = wosObject.getObjectContent();
for (int n = 0; n != -1;) {
    n = in.read(buf, 0, buf.length);
}
in.close();

说明:

  • 如果指定的范围无效(如范围为负数或大于文件大小),返回整个对象内容。
  • 可结合并发方式实现大对象的并行分片下载,具体可参考 ConcurrentDownloadObjectSample

3. 限定条件下载

下载对象时可指定限定条件,只有满足条件才会下载,否则抛出异常,下载对象失败。

您可以使用的限定条件如下:

参数 作用说明 WOS Java SDK 对应方法
If-Modified-Since 如果对象修改时间晚于该时间,返回对象内容,否则抛出异常。 GetObjectRequest.setIfModifiedSince
If-Unmodified-Since 如果对象修改时间早于该时间,返回对象内容,否则抛出异常。 GetObjectRequest.setIfUnmodifiedSince
If-Match 如果对象 ETag 与该值相同,返回对象内容,否则抛出异常。 GetObjectRequest.setIfMatchTag
If-None-Match 如果对象 ETag 与该值不同,返回对象内容,否则抛出异常。 GetObjectRequest.setIfNoneMatchTag

说明:

  • 对象的 ETag 为对象数据的 MD5 校验值。
  • 若包含 If-Unmodified-Since 或 If-Match 并且不符合,HTTP 状态码为 412 Precondition Failed
  • 若包含 If-Modified-Since 或 If-None-Match 并且不符合,HTTP 状态码为 304 Not Modified

限定条件下载代码示例

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
request.setRangeStart(0l);
request.setRangeEnd(1000l);
request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01"));
WosObject wosObject = wosClient.getObject(request);

wosObject.getObjectContent().close();

4. 重写响应头

下载对象时可以重写部分 HTTP/HTTPS 响应头信息。可重写的响应头信息见下表:

参数 作用说明 WOS Java SDK 对应方法
contentType 重写响应中的 Content-Type ObjectRepleaceMetadata.setContentType
contentLanguage 重写响应中的 Content-Language ObjectRepleaceMetadata.setContentLanguage
expires 重写响应中的 Expires ObjectRepleaceMetadata.setExpires
cacheControl 重写响应中的 Cache-Control ObjectRepleaceMetadata.setCacheControl
contentDisposition 重写响应中的 Content-Disposition ObjectRepleaceMetadata.setContentDisposition
contentEncoding 重写响应中的 Content-Encoding ObjectRepleaceMetadata.setContentEncoding

重写响应头示例代码

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// 创建WosClient实例
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
ObjectRepleaceMetadata replaceMetadata = new ObjectRepleaceMetadata();
replaceMetadata.setContentType("image/jpeg");
request.setReplaceMetadata(replaceMetadata);

WosObject wosObject = wosClient.getObject(request);
System.out.println(wosObject.getMetadata().getContentType());

wosObject.getObjectContent().close();

5. 获取自定义元数据

可在下载对象时获取对象的自定义元数据。以下代码展示了如何获取自定义元数据:

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

// 上传对象,设置自定义元数据
PutObjectRequest request = new PutObjectRequest("bucketname", "objectname");
ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata("property", "property-value");
request.setMetadata(metadata);
wosClient.putObject(request);

// 下载对象,获取对象自定义元数据
WosObject wosObject = wosClient.getObject("bucketname", "objectname");
System.out.println(wosObject.getMetadata().getUserMetadata("property"));

wosObject.getObjectContent().close();

6. 下载归档存储对象

如果要下载归档存储对象,需要先将归档存储对象取回,您可以通过WosClient.restoreObject取回归档存储对象。以下代码展示了如何下载归档存储对象:

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// 创建WosClient实例
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

RestoreObjectRequest request = new RestoreObjectRequest();
request.setBucketName("bucketname");
request.setObjectKey("objectname");
request.setDays(1);
wosClient.restoreObject(request);

// 等待对象取回
Thread.sleep(60 * 6 * 1000);

// 下载对象
WosObject wosObject = wosClient.getObject("bucketname", "objectname");

wosObject.getObjectContent().close();

说明:

  • WosClient.restoreObject 中指定的对象必须是归档存储类型,否则调用该接口会抛出异常。
本篇文档内容对您是否有帮助?
有帮助
我要反馈
提交成功!非常感谢您的反馈,我们会继续努力做到更好!