下载对象

最近更新时间:2024-08-14 17:37:42

我的收藏

简介

本文介绍对象存储 COS 通过 Android SDK 实现下载对象功能的示例代码和描述。包括高级接口、简单接口两个部分。

注意事项

若您使用简单下载,需要具有目标对象的读权限:在您进行 授权策略 时,action 需要设置为cos:GetObject ,更多授权请参见 支持CAM的业务接口
若您使用高级下载,因为支持断点续传,会在下载前先发起 HEAD 请求获取文件信息,因此需要具有目标对象的 head 权限和读权限:在您进行 授权策略 时,action 需要设置为cos:GetObjectcos:HeadObject,更多授权请参见 支持CAM的业务接口

相关示例

功能名称
描述
示例代码
高级接口
高级接口支持暂停、恢复以及取消下载请求,同时支持断点下载功能。
简单接口
GET Object 接口可以实现下载对象到本地文件,不支持断点下载功能。

高级接口(推荐)

高级接口支持暂停、恢复以及取消下载请求,同时支持断点下载功能。

前期准备:创建 TransferManager

使用高级接口的操作之前,必须先创建一个 TransferManager 的实例。创建 TransferManager 的实例之前,需要创建一个 CosXmlService 实例,详细代码可以参见 创建 CosXmlService
// 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档
// 默认对大于或等于2M的文件自动进行分块上传,分块大小为1M,可以通过如下代码修改分块阈值
TransferConfig transferConfig = new TransferConfig.Builder() // 设置启用分块上传的最小对象大小 默认为2M .setDivisionForUpload(2097152) // 设置分块上传时的分块大小 默认为1M .setSliceSizeForUpload(1048576) // 设置是否强制使用简单上传, 禁止分块上传 .setForceSimpleUpload(false) .build();
// 初始化 TransferManager
TransferManager transferManager = new TransferManager(cosXmlService,
transferConfig);

使用案例:下载对象

// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
String bucket = "examplebucket-1250000000";
String cosPath = "exampleobject.txt"; //对象在存储桶中的位置标识符,即称对象键
//本地目录路径
String savePathDir = context.getExternalCacheDir().toString();
//本地保存的文件名,若不填(null),则与 COS 上的文件名一样
String savedFileName = "exampleobject.txt";

Context applicationContext = context.getApplicationContext(); // application
// context
COSXMLDownloadTask cosxmlDownloadTask =
transferManager.download(applicationContext,
bucket, cosPath, savePathDir, savedFileName);

//设置下载进度回调
cosxmlDownloadTask.setCosXmlProgressListener(new CosXmlProgressListener() {
@Override
public void onProgress(long complete, long target) {
// todo Do something to update progress...
}
});
//设置返回结果回调
cosxmlDownloadTask.setCosXmlResultListener(new CosXmlResultListener() {
@Override
public void onSuccess(CosXmlRequest request, CosXmlResult result) {
COSXMLDownloadTask.COSXMLDownloadTaskResult downloadTaskResult =
(COSXMLDownloadTask.COSXMLDownloadTaskResult) result;
}

// 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
// clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
@Override
public void onFail(CosXmlRequest request,
@Nullable CosXmlClientException clientException,
@Nullable CosXmlServiceException serviceException) {
if (clientException != null) {
clientException.printStackTrace();
} else {
serviceException.printStackTrace();
}
}
});
//设置任务状态回调,可以查看任务过程
cosxmlDownloadTask.setTransferStateListener(new TransferStateListener() {
@Override
public void onStateChanged(TransferState state) {
// todo notify transfer state
}
});

使用案例:下载暂停、继续与取消

对于下载任务,可以通过以下方式暂停:
cosxmlDownloadTask.pause();
暂停之后,可以通过以下方式续传:
cosxmlDownloadTask.resume();
也可通过以下方式取消下载:
cosxmlDownloadTask.cancel();

使用案例:设置下载支持断点续传

// TransferManager 支持断点下载,您只需要保证 bucket、cosPath、savePathDir、savedFileName
// 参数一致,SDK 便会从上次已经下载的位置继续下载。
// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
String bucket = "examplebucket-1250000000";
String cosPath = "exampleobject.txt"; //对象在存储桶中的位置标识符,即称对象键
//本地目录路径
String savePathDir = context.getExternalCacheDir().toString();
//本地保存的文件名,若不填(null),则与 COS 上的文件名一样
String savedFileName = "exampleobject.txt";

GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, cosPath, savePathDir, savedFileName);

Context applicationContext = context.getApplicationContext(); // application
// context
COSXMLDownloadTask cosxmlDownloadTask =
transferManager.download(applicationContext, getObjectRequest);

使用案例:批量下载

// 对象在存储桶中的位置标识符,即称对象键
String[] cosPaths = new String[] {
"exampleobject1.txt",
"exampleobject2.txt",
"exampleobject3.txt",
};

for (String cosPath : cosPaths) {
COSXMLDownloadTask cosxmlDownloadTask =
transferManager.download(applicationContext,
bucket, cosPath, savePathDir, savedFileName);
// 设置返回结果回调
cosxmlDownloadTask.setCosXmlResultListener(new CosXmlResultListener() {
@Override
public void onSuccess(CosXmlRequest request, CosXmlResult result) {
COSXMLDownloadTask.COSXMLDownloadTaskResult downloadResult =
(COSXMLDownloadTask.COSXMLDownloadTaskResult) result;
}

// 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
// clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
@Override
public void onFail(CosXmlRequest request,
@Nullable CosXmlClientException clientException,
@Nullable CosXmlServiceException serviceException) {
if (clientException != null) {
clientException.printStackTrace();
} else {
serviceException.printStackTrace();
}
}
});
}

使用案例:下载目录

boolean isTruncated = true;
String marker = null;
try {
while (isTruncated) {
GetBucketRequest getBucketRequest = new GetBucketRequest(region, bucket, directoryPath);
// 设置分页信息
getBucketRequest.setMarker(marker);
// 设置不查询子目录
getBucketRequest.setDelimiter("/");
GetBucketResult getBucketResult = cosXmlService.getBucket(getBucketRequest);
// 批量下载
for (ListBucket.Contents content : getBucketResult.listBucket.contentsList) {
GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, content.key, savePathDir);
transferManager.download(context,getObjectRequest);
}
isTruncated = getBucketResult.listBucket.isTruncated;
marker = getBucketResult.listBucket.nextMarker;
}
} catch (CosXmlServiceException serviceException) {
serviceException.printStackTrace();
} catch (CosXmlClientException clientException) {
clientException.printStackTrace();
}

使用案例:匿名下载(不用传入密钥,对公开文件进行下载)

// 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档
TransferConfig transferConfig = new TransferConfig.Builder().build();
// 初始化 TransferManager
CosXmlServiceConfig cosXmlServiceConfig = new CosXmlServiceConfig.Builder()
.setRegion("ap-guangzhou")
.builder();
// 匿名下载生成 CosXmlService 不需要传入密钥生成器
CosXmlService cosXmlService = new CosXmlService(context, cosXmlServiceConfig);
TransferManager transferManager = new TransferManager(cosXmlService, transferConfig);
// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
String bucket = "examplebucket-1250000000";
String cosPath = "exampleobject.txt"; //对象在存储桶中的位置标识符,即称对象键
// 本地目录路径
String savePathDir = context.getExternalCacheDir().toString();
// 本地保存的文件名,若不填(null),则与 COS 上的文件名一样
String savedFileName = "exampleobject.txt";

GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, cosPath, savePathDir, savedFileName);

Context applicationContext = context.getApplicationContext(); // application
// context
COSXMLDownloadTask cosxmlDownloadTask =
transferManager.download(applicationContext, getObjectRequest);

简单下载

下载一个 Object(文件/对象)至本地(GET Object)。

前期准备:创建 CosXmlService

调用 COS 的接口之前,必须先创建一个 CosXmlService 的实例,详细代码可以参见 创建 CosXmlService

使用案例:下载对象到本地文件

String bucket = "examplebucket-1250000000"; //存储桶名称,格式:BucketName-APPID
String cosPath = "exampleobject.txt"; //对象位于存储桶中的位置标识符,即对象键
String savePath = context.getExternalCacheDir().toString(); //本地路径

GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, cosPath,
savePath);
getObjectRequest.setProgressListener(new CosXmlProgressListener() {
@Override
public void onProgress(long progress, long max) {
// todo Do something to update progress...
}
});

cosXmlService.getObjectAsync(getObjectRequest, new CosXmlResultListener() {
@Override
public void onSuccess(CosXmlRequest cosXmlRequest,
CosXmlResult cosXmlResult) {
GetObjectResult getObjectResult = (GetObjectResult) cosXmlResult;
}

// 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:
// clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?
@Override
public void onFail(CosXmlRequest cosXmlRequest,
@Nullable CosXmlClientException clientException,
@Nullable CosXmlServiceException serviceException) {
if (clientException != null) {
clientException.printStackTrace();
} else {
serviceException.printStackTrace();
}
}
});

SDK API 参考

SDK 所有接口的具体参数与方法说明,请参考 SDK API 参考

API 操作

关于下载对象接口涉及的 API 接口说明,请参见 GET ObjectHEAD Object 查看。