简介
本文介绍对象存储 COS 通过 Android SDK 实现下载对象功能的示例代码和描述。包括高级接口、简单接口两个部分。
注意事项
若您使用高级下载,因为支持断点续传,会在下载前先发起 HEAD 请求获取文件信息,因此需要具有目标对象的 head 权限和读权限:在您进行 授权策略 时,action 需要设置为
cos:GetObject
, cos: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();// 初始化 TransferManagerTransferManager transferManager = new TransferManager(cosXmlService,transferConfig);
使用案例:下载对象
// 存储桶名称,由 bucketname-appid 组成,appid 必须填入,可以在 COS 控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucketString bucket = "examplebucket-1250000000";String cosPath = "exampleobject.txt"; //对象在存储桶中的位置标识符,即称对象键//本地目录路径String savePathDir = context.getExternalCacheDir().toString();//本地保存的文件名,若不填(null),则与 COS 上的文件名一样String savedFileName = "exampleobject.txt";Context applicationContext = context.getApplicationContext(); // application// contextCOSXMLDownloadTask cosxmlDownloadTask =transferManager.download(applicationContext,bucket, cosPath, savePathDir, savedFileName);//设置下载进度回调cosxmlDownloadTask.setCosXmlProgressListener(new CosXmlProgressListener() {@Overridepublic void onProgress(long complete, long target) {// todo Do something to update progress...}});//设置返回结果回调cosxmlDownloadTask.setCosXmlResultListener(new CosXmlResultListener() {@Overridepublic void onSuccess(CosXmlRequest request, CosXmlResult result) {COSXMLDownloadTask.COSXMLDownloadTaskResult downloadTaskResult =(COSXMLDownloadTask.COSXMLDownloadTaskResult) result;}// 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:// clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?@Overridepublic void onFail(CosXmlRequest request,@Nullable CosXmlClientException clientException,@Nullable CosXmlServiceException serviceException) {if (clientException != null) {clientException.printStackTrace();} else {serviceException.printStackTrace();}}});//设置任务状态回调,可以查看任务过程cosxmlDownloadTask.setTransferStateListener(new TransferStateListener() {@Overridepublic 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/bucketString 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// contextCOSXMLDownloadTask 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() {@Overridepublic void onSuccess(CosXmlRequest request, CosXmlResult result) {COSXMLDownloadTask.COSXMLDownloadTaskResult downloadResult =(COSXMLDownloadTask.COSXMLDownloadTaskResult) result;}// 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:// clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?@Overridepublic 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();// 初始化 TransferManagerCosXmlServiceConfig 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/bucketString 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// contextCOSXMLDownloadTask cosxmlDownloadTask =transferManager.download(applicationContext, getObjectRequest);
简单下载
下载一个 Object(文件/对象)至本地(GET Object)。
前期准备:创建 CosXmlService
使用案例:下载对象到本地文件
String bucket = "examplebucket-1250000000"; //存储桶名称,格式:BucketName-APPIDString cosPath = "exampleobject.txt"; //对象位于存储桶中的位置标识符,即对象键String savePath = context.getExternalCacheDir().toString(); //本地路径GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, cosPath,savePath);getObjectRequest.setProgressListener(new CosXmlProgressListener() {@Overridepublic void onProgress(long progress, long max) {// todo Do something to update progress...}});cosXmlService.getObjectAsync(getObjectRequest, new CosXmlResultListener() {@Overridepublic void onSuccess(CosXmlRequest cosXmlRequest,CosXmlResult cosXmlResult) {GetObjectResult getObjectResult = (GetObjectResult) cosXmlResult;}// 如果您使用 kotlin 语言来调用,请注意回调方法中的异常是可空的,否则不会回调 onFail 方法,即:// clientException 的类型为 CosXmlClientException?,serviceException 的类型为 CosXmlServiceException?@Overridepublic void onFail(CosXmlRequest cosXmlRequest,@Nullable CosXmlClientException clientException,@Nullable CosXmlServiceException serviceException) {if (clientException != null) {clientException.printStackTrace();} else {serviceException.printStackTrace();}}});