下载文件
BOS Java SDK提供了丰富的文件下载接口,用户可以通过以下方式从BOS中下载文件:
- 简单流式下载
- 下载到本地文件
- 断点续传下载
- 范围下载
- 下载进度条
完整示例代码请参考下载文件Demo
简单流式下载
用户可以通过如下代码将Object读取到一个流中:
public void getObject(BosClient client, String bucketName, String objectKey)
throws IOException {
// 获取Object,返回结果为BosObject对象
BosObject object = client.getObject(bucketName, objectKey);
// 获取ObjectMeta
ObjectMetadata meta = object.getObjectMetadata();
// 获取Object的输入流
InputStream objectContent = object.getObjectContent();
// 处理Object
...
// 关闭流
objectContent.close();
}
注意:
- BosObject中包含了Object的各种信息,包含Object所在的Bucket、Object的名称、MetaData以及一个输入流,用户可以通过操作输入流将Object的内容读取到文件或者内存中。
- ObjectMetadata中包含了Object上传时定义的ETag,Http Header以及自定义的元数据。
- 通过BosObject的getObjectContent方法,还可以获取返回Object的输入流,用户可以读取这个输入流来对Object的内容进行操作。
直接下载Object到文件
用户可以通过如下代码直接将Object下载到指定文件:
// 新建GetObjectRequest
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);
// 下载Object到文件
ObjectMetadata objectMetadata = client.getObject(getObjectRequest, new File("/path/to/file","filename"));
当使用上面方法将Object直接下载到文件时,方法返回ObjectMetadata对象。
范围下载
为了实现更多的功能,可以通过使用GetObjectRequest来指定下载范围,实现更精细化地获取Object。如果指定的下载范围是0 - 100,则返回第0到第100个字节的数据,包括第100个,共101字节的数据,即[0, 100]。
// 新建GetObjectRequest
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);
// 获取0~100字节范围内的数据
getObjectRequest.setRange(0, 100);
// 获取Object,返回结果为BosObject对象
BosObject object = client.getObject(getObjectRequest);
通过getObjectRequest的setRange方法可以设置返回Object的范围。用户也可以用此功能实现文件的分段下载和断点续传。
其他使用方法
获取Object的存储类型
Object的storage class属性分为STANDARD
(标准存储), STANDARD_IA
(低频存储)和COLD
(冷存储),通过如下代码可以实现:
public void getObjectStorageClass(){
ObjectMetadata meta = client.getObjectMetadata(bucketName, key);
String storageClass = meta.getStorageClass();
}
只获取ObjectMetadata
通过 getObjectMetadata 方法可以只获取ObjectMetadata而不获取Object的实体。如下代码所示:
ObjectMetadata objectMetadata = client.getObjectMetadata(bucketName, objectKey);
getObjectMetadata
方法返回的解析类中可供调用的参数有:
参数 | 说明 |
---|---|
contentType | Object的类型 |
contentLength | Object的大小 |
contentMd5 | Object的MD5 |
etag | Object的HTTP协议实体标签 |
storageClass | Object的存储类型 |
userMetadata | 如果在PutObject指定了userMetadata自定义meta,则返回此项 |
xBceCrc | 如果在PutObject指定了object的CRC值(循环冗余校验码),则返回此项 |
单链接限速
对象存储BOS的单Bucket带宽是有限制的,当用户的上传或下载占用带宽达到带宽限制阈值时,会返回RequestRateLimitExceeded的错误码。
为保证用户能够正常使用服务,BOS支持在进行上传、下载等行为时进行流量控制,保证大流量服务占用带宽不会对其他应用服务造成影响。
下载接口支持设置指定限速值,限速值的取值范围为819200~838860800,单位为bit/s,即100KB/s~100MB/s。限速值取值必须为数字,BOS将按照指定的限速值对此次请求进行限速,当限速值不在此范围或不合法时将返回错误。
- GetObject示例代码:
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);
// 指定下载的限速值为819200bit/s,即100KB/s
getObjectRequest.setTrafficLimitBitPS(819200);
ObjectMetadata objectMetadata = client.getObject(getObjectRequest, new File("/path/to/file","filename"));
下载进度条
SDK支持在上传过程中实时提供上传进度信息。Java SDK定义的上传进度回调接口如下,您可以在其中定义上传过程中您所需要的操作,如更新界面等等。
public interface ProgressCallback<T> {
void onProgress(long currentSize, long totalSize, T data);
}
- GetObject示例代码:
File file = new File("tmp-download");
BosProgressCallback<Object> callback = new BosProgressCallback<Object>() {
@Override
public void onProgress(long currentSize, long totalSize, Object data) {
System.out.println("get " + currentSize + "/" + totalSize);
}
};
GetObjectRequest getObjectRequest = new GetObjectRequest("bucketName","objectKey");
getObjectRequest.setProgressCallback(callback);
this.client.getObject(getObjectRequest, file);