下载对象

最近更新时间:2024-08-13 16:19:52

我的收藏

简介

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

注意事项

若您想要下载对象,需要具有目标对象的读权限:在您进行 授权策略 时,action 需要设置为cos:GetObject ,更多授权请参见 支持CAM的业务接口

相关示例

功能名称
描述
示例代码
高级接口
高级接口封装了简单下载接口,支持断点下载。
简单接口
GET Object 接口可以实现下载对象到本地文件。

高级接口(推荐)

功能说明

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

使用案例:下载单个对象

Objective-C
Swift
QCloudCOSXMLDownloadObjectRequest * request = [QCloudCOSXMLDownloadObjectRequest new];

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = [NSURL fileURLWithPath:@"Local File Path"];

// 本地已下载的文件大小,如果是从头开始下载,请不要设置
request.localCacheDownloadOffset = 100;

// 监听下载结果
[request setFinishBlock:^(id outputObject, NSError *error) {
// outputObject 包含所有的响应 http 头部
NSDictionary* info = (NSDictionary *) outputObject;
// 若未指定下载路径,则通过下面方式获取下载的 NSData 数据。
NSData * data = [outputObject __originHTTPResponseData__];
}];

// 监听下载进度
[request setDownProcessBlock:^(int64_t bytesDownload,
int64_t totalBytesDownload,
int64_t totalBytesExpectedToDownload) {

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}];

[[QCloudCOSTransferMangerService defaultCOSTransferManager] DownloadObject:request];
let request : QCloudCOSXMLDownloadObjectRequest = QCloudCOSXMLDownloadObjectRequest();

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = "examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = "exampleobject";

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = NSURL.fileURL(withPath: "Local File Path") as URL?;

// 本地已下载的文件大小,如果是从头开始下载,请不要设置
request.localCacheDownloadOffset = 100;

// 监听下载进度
request.sendProcessBlock = { (bytesDownload, totalBytesDownload,
totalBytesExpectedToDownload) in

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}

// 监听下载结果
request.finishBlock = { (result, error) in
if let result = result {
// result 包含响应的 header 信息
// 若未指定下载路径,则通过下面方式获取下载的 Data 数据。
let data = (result as! NSObject).__originHTTPResponseData__;
} else {
print(error!);
}
}

QCloudCOSTransferMangerService.defaultCOSTransferManager().downloadObject(request);

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

Objective-C
Swift
对于下载任务,可以通过以下方式暂停:
[request cancel];
暂停之后,可以通过以下方式续传:
// 本地已下载的文件大小
int64_t localCacheDownloadOffset = 0;
request.localCacheDownloadOffset = localCacheDownloadOffset;
也可以通过以下方式取消下载:
[request cancel];
对于下载任务,可以通过以下方式暂停:
request.cancel();
暂停之后,可以通过以下方式续传:
// 本地已下载的文件大小

let localCacheDownloadOffset = 100;
request.localCacheDownloadOffset = Int64(localCacheDownloadOffset);
也通过以下方式取消下载:
request.cancel();

使用案例:断点下载

Objective-C
Swift
QCloudCOSXMLDownloadObjectRequest *getObjectRequest = [[QCloudCOSXMLDownloadObjectRequest alloc] init];
//支持断点下载,默认不支持
getObjectRequest.resumableDownload = true;
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
getObjectRequest.bucket = @"examplebucket-1250000000";
// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
getObjectRequest.downloadingURL = [NSURL URLWithString:QCloudTempFilePathWithExtension(@"downding")];
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
getObjectRequest.object = @"exampleobject";
// 监听下载结果
[getObjectRequest setFinishBlock:^(id outputObject, NSError *error) {
// outputObject 包含所有的响应 http 头部
NSDictionary* info = (NSDictionary *) outputObject;
}];

// 监听下载进度
[getObjectRequest setDownProcessBlock:^(int64_t bytesDownload,
int64_t totalBytesDownload,
int64_t totalBytesExpectedToDownload) {

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}];

[[QCloudCOSTransferMangerService defaultCOSTransferManager] DownloadObject:getObjectRequest];
let request : QCloudCOSXMLDownloadObjectRequest = QCloudCOSXMLDownloadObjectRequest();

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = "examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = "exampleobject";

request.resumableDownload = true;
// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = NSURL.fileURL(withPath: "Local File Path") as URL?;

// 本地已下载的文件大小,如果是从头开始下载,请不要设置
request.localCacheDownloadOffset = 100;

// 监听下载进度
request.sendProcessBlock = { (bytesDownload, totalBytesDownload,
totalBytesExpectedToDownload) in

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}

// 监听下载结果
request.finishBlock = { (result, error) in
if let result = result {
// result 包含响应的 header 信息
} else {
print(error!);
}
}

QCloudCOSTransferMangerService.defaultCOSTransferManager().downloadObject(request);

使用案例:批量下载

Objective-C
Swift
for (int i = 0; i<20; i++) {
QCloudCOSXMLDownloadObjectRequest * request = [QCloudCOSXMLDownloadObjectRequest new];

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = [NSURL fileURLWithPath:@"Local File Path"];

// 本地已下载的文件大小,如果是从头开始下载,请不要设置
request.localCacheDownloadOffset = 100;

// 监听下载结果
[request setFinishBlock:^(id outputObject, NSError *error) {
// outputObject 包含所有的响应 http 头部
NSDictionary* info = (NSDictionary *) outputObject;
}];

// 监听下载进度
[request setDownProcessBlock:^(int64_t bytesDownload,
int64_t totalBytesDownload,
int64_t totalBytesExpectedToDownload) {

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}];

[[QCloudCOSTransferMangerService defaultCOSTransferManager] DownloadObject:request];
}
for i in 1...10 {
let request : QCloudCOSXMLDownloadObjectRequest = QCloudCOSXMLDownloadObjectRequest();

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = "examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = "exampleobject";

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = NSURL.fileURL(withPath: "Local File Path") as URL?;

// 本地已下载的文件大小,如果是从头开始下载,请不要设置
request.localCacheDownloadOffset = 100;

// 监听下载进度
request.sendProcessBlock = { (bytesDownload, totalBytesDownload,
totalBytesExpectedToDownload) in

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}

// 监听下载结果
request.finishBlock = { (result, error) in
if let result = result {
// result 包含响应的 header 信息
} else {
print(error!);
}
}

QCloudCOSTransferMangerService.defaultCOSTransferManager().downloadObject(request);
}

使用案例:下载文件夹及其文件

Objective-C
Swift
QCloudGetBucketRequest* request = [QCloudGetBucketRequest new];

// 存储桶名称,格式为 BucketName-APPID
request.bucket = @"examplebucket-1250000000";
// 单次返回的最大条目数量,默认1000
request.maxKeys = 100;

//要下载的文件夹在cos上的完整路径

request.prefix = @"cos_path";


[request setFinishBlock:^(QCloudListBucketResult * result, NSError* error) {
if(!error){
for (QCloudBucketContents *content in result.contents) {
QCloudCOSXMLDownloadObjectRequest * request = [QCloudCOSXMLDownloadObjectRequest new];

// 存储桶名称,格式为 BucketName-APPID
request.bucket = @"examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
request.object = content.key;

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = [NSURL fileURLWithPath:[@"Local File Path" stringByAppendingFormat:@"/%@",content.key]];

// 监听下载结果
[request setFinishBlock:^(id outputObject, NSError *error) {
// outputObject 包含所有的响应 http 头部
NSDictionary* info = (NSDictionary *) outputObject;
}];

// 监听下载进度
[request setDownProcessBlock:^(int64_t bytesDownload,
int64_t totalBytesDownload,
int64_t totalBytesExpectedToDownload) {

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}];

[[QCloudCOSTransferMangerService defaultCOSTransferManager] DownloadObject:request];
}


}
}];

[[QCloudCOSXMLService defaultCOSXML] GetBucket:request];
let getBucketReq = QCloudGetBucketRequest.init();

// 存储桶名称,格式为 BucketName-APPID
getBucketReq.bucket = "examplebucket-1250000000";

// 单次返回的最大条目数量,默认1000
getBucketReq.maxKeys = 100;

//要下载的文件夹在cos上的完整路径
getBucketReq.prefix = "cos_path";

getBucketReq.setFinish { (result, error) in
if let result = result {
let contents = result.contents;
for content in contents {
let info = QCloudDeleteObjectInfo.init();
let request : QCloudCOSXMLDownloadObjectRequest = QCloudCOSXMLDownloadObjectRequest();

// 存储桶名称,格式为 BucketName-APPID
request.bucket = "examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
request.object = content.key;

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中

request.downloadingURL = NSURL.fileURL(withPath: "Local File Path" ) as URL?;

// 本地已下载的文件大小,如果是从头开始下载,请不要设置
request.localCacheDownloadOffset = 100;

// 监听下载进度
request.sendProcessBlock = { (bytesDownload, totalBytesDownload,
totalBytesExpectedToDownload) in

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}

// 监听下载结果
request.finishBlock = { (result, error) in
if let result = result {
// result 包含响应的 header 信息
} else {
print(error!);
}
}

QCloudCOSTransferMangerService.defaultCOSTransferManager().downloadObject(request);
}
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().getBucket(getBucketReq);

使用案例:下载时限速

Objective-C
Swift
注意:
需要 COS iOS SDK v5.9.5 及以上版本。
QCloudCOSXMLDownloadObjectRequest * request = [QCloudCOSXMLDownloadObjectRequest new];

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = [NSURL fileURLWithPath:@"Local File Path"];

// 本地已下载的文件大小,如果是从头开始下载,请不要设置
request.localCacheDownloadOffset = 100;

// 使用trafficLimit参数设置下载限速,单位为bit/s,限速值设置范围为819200 - 838860800,即800Kb/s - 800Mb/s。
request.trafficLimit = 819200;

// 监听下载结果
[request setFinishBlock:^(id outputObject, NSError *error) {
// outputObject 包含所有的响应 http 头部
NSDictionary* info = (NSDictionary *) outputObject;
}];

// 监听下载进度
[request setDownProcessBlock:^(int64_t bytesDownload,
int64_t totalBytesDownload,
int64_t totalBytesExpectedToDownload) {

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}];

[[QCloudCOSTransferMangerService defaultCOSTransferManager] DownloadObject:request];
注意:
需要 COS iOS SDK v5.9.5 及以上版本。
let request : QCloudCOSXMLDownloadObjectRequest = QCloudCOSXMLDownloadObjectRequest();

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = "examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = "exampleobject";

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = NSURL.fileURL(withPath: "Local File Path") as URL?;

// 本地已下载的文件大小,如果是从头开始下载,请不要设置
request.localCacheDownloadOffset = 100;

// 使用trafficLimit参数设置下载限速,单位为bit/s,限速值设置范围为819200 - 838860800,即800Kb/s - 800Mb/s。
request.trafficLimit = 819200;

// 监听下载进度
request.sendProcessBlock = { (bytesDownload, totalBytesDownload,
totalBytesExpectedToDownload) in

// bytesDownload 新增字节数
// totalBytesDownload 本次下载接收的总字节数
// totalBytesExpectedToDownload 本次下载的目标字节数
}

// 监听下载结果
request.finishBlock = { (result, error) in
if let result = result {
// result 包含响应的 header 信息
} else {
print(error!);
}
}

QCloudCOSTransferMangerService.defaultCOSTransferManager().downloadObject(request);

简单接口

功能说明

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

使用案例:下载对象

Objective-C
Swift
QCloudGetObjectRequest* request = [QCloudGetObjectRequest new];

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = [NSURL URLWithString:QCloudTempFilePathWithExtension(@"downding")];

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";

[request setFinishBlock:^(id outputObject, NSError *error) {
// 可以从 outputObject 中获取 response 中 etag 或者自定义头部等信息
NSDictionary* result = (NSDictionary *) outputObject;
// 服务端文件的crc64
result[@"x-cos-hash-crc64ecma"];
// 下载到本地的文件crc64 若返回的crc64与本地计算一致,则表示下载的文件与远端文件完整一致;
NSData * data;// 本地文件Data数据;
uint64_t localCrc64 = [data qcloud_crc64];
}];
[request setDownProcessBlock:^(int64_t bytesDownload, int64_t totalBytesDownload,
int64_t totalBytesExpectedToDownload) {

// 下载过程中的进度
// bytesDownload 一次下载的字节数,
// totalBytesDownload 总过接受的字节数
// totalBytesExpectedToDownload 文件一共多少字节

}];

[[QCloudCOSXMLService defaultCOSXML] GetObject:request];
let getObject = QCloudGetObjectRequest.init();

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
getObject.bucket = "examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
getObject.object = "exampleobject";
// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
getObject.downloadingURL = URL.init(string: NSTemporaryDirectory())!
.appendingPathComponent(getObject.object);
getObject.finishBlock = {(result,error) in
if let result = result {
// result 包含响应的 header 信息
// 获取文件crc64
let crc64 = (result as? NSObject)?.__originHTTPURLResponse__.allHeaderFields["x-cos-hash-crc64ecma"];
} else {
print(error!);
}
};
getObject.downProcessBlock = {(bytesDownload, totalBytesDownload,
totalBytesExpectedToDownload) in
// bytesDownload 一次下载的字节数,
// totalBytesDownload 总过接受的字节数
// totalBytesExpectedToDownload 文件一共多少字节
}
QCloudCOSXMLService.defaultCOSXML().getObject(getObject);

使用案例:下载时限速

Objective-C
Swift
注意:
需要 COS iOS SDK v5.9.5 及以上版本。
QCloudGetObjectRequest* request = [QCloudGetObjectRequest new];

// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
request.downloadingURL = [NSURL URLWithString:QCloudTempFilePathWithExtension(@"downding")];

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";

// 使用trafficLimit参数设置下载限速,单位为bit/s,限速值设置范围为819200 - 838860800,即800Kb/s - 800Mb/s。
request.trafficLimit = 819200;

[request setFinishBlock:^(id outputObject, NSError *error) {
// 可以从 outputObject 中获取 response 中 etag 或者自定义头部等信息
NSDictionary* info = (NSDictionary *) outputObject;
// 获取文件crc64
NSString * crc64 = [[info __originHTTPURLResponse__].allHeaderFields valueForKey:@"x-cos-hash-crc64ecma"];
}];
[request setDownProcessBlock:^(int64_t bytesDownload, int64_t totalBytesDownload,
int64_t totalBytesExpectedToDownload) {

// 下载过程中的进度
// bytesDownload 一次下载的字节数,
// totalBytesDownload 总过接受的字节数
// totalBytesExpectedToDownload 文件一共多少字节

}];

[[QCloudCOSXMLService defaultCOSXML] GetObject:request];
注意:
需要 COS iOS SDK v5.9.5 及以上版本。
let getObject = QCloudGetObjectRequest.init();

// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
getObject.bucket = "examplebucket-1250000000";

// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
getObject.object = "exampleobject";
// 设置下载的路径 URL,如果设置了,文件将会被下载到指定路径中
getObject.downloadingURL = URL.init(string: NSTemporaryDirectory())!
.appendingPathComponent(getObject.object);

// 使用trafficLimit参数设置下载限速,单位为bit/s,限速值设置范围为819200 - 838860800,即800Kb/s - 800Mb/s。
getObject.trafficLimit = 819200;

getObject.finishBlock = {(result,error) in
if let result = result {
// result 包含响应的 header 信息
// 获取文件crc64
let crc64 = result?.__originHTTPURLResponse__.allHeaderFields["x-cos-hash-crc64ecma"];
} else {
print(error!);
}
};
getObject.downProcessBlock = {(bytesDownload, totalBytesDownload,
totalBytesExpectedToDownload) in
// bytesDownload 一次下载的字节数,
// totalBytesDownload 总过接受的字节数
// totalBytesExpectedToDownload 文件一共多少字节
}
QCloudCOSXMLService.defaultCOSXML().getObject(getObject);

SDK API 参考

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

API 操作

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