更新时间:2025-08-18 15:54:18
WOS Java SDK 提供了丰富的对象下载接口,您可以通过 WosClient.getObject 下载对象。
以下代码展示了如何进行流式下载:
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获取的对象输入流一定要显式关闭,否则会造成资源泄露。
如果只需要下载对象的部分数据,可以使用范围下载功能,下载指定范围的数据。如果指定的下载范围是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。下载对象时可指定限定条件,只有满足条件才会下载,否则抛出异常,下载对象失败。
您可以使用的限定条件如下:
| 参数 | 作用说明 | WOS Java SDK 对应方法 |
|---|---|---|
| If-Modified-Since | 如果对象修改时间晚于该时间,返回对象内容,否则抛出异常。 | GetObjectRequest.setIfModifiedSince |
| If-Unmodified-Since | 如果对象修改时间早于该时间,返回对象内容,否则抛出异常。 | GetObjectRequest.setIfUnmodifiedSince |
| If-Match | 如果对象 ETag 与该值相同,返回对象内容,否则抛出异常。 | GetObjectRequest.setIfMatchTag |
| If-None-Match | 如果对象 ETag 与该值不同,返回对象内容,否则抛出异常。 | GetObjectRequest.setIfNoneMatchTag |
说明:
412 Precondition Failed。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();
下载对象时可以重写部分 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();
可在下载对象时获取对象的自定义元数据。以下代码展示了如何获取自定义元数据:
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();
如果要下载归档存储对象,需要先将归档存储对象取回,您可以通过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 中指定的对象必须是归档存储类型,否则调用该接口会抛出异常。