简介
本文档提供关于复制、移动对象的 API 概览以及 SDK 示例代码。
简单操作
API | 操作名 | 操作描述 |
---|---|---|
PUT Object - Copy | 设置对象复制(修改对象属性) | 复制文件到目标路径 |
DELETE Object | 删除单个对象 | 在存储桶中删除指定对象 |
分块操作
API | 操作名 | 操作描述 |
---|---|---|
List Multipart Uploads | 查询分块上传/复制 | 查询正在进行中的分块上传/复制信息 |
Initiate Multipart Upload | 初始化分块上传/复制 | 初始化分块上传/复制操作 |
Upload Part - Copy | 复制分块 | 将其他对象复制为一个分块 |
List Parts | 查询已上传/复制块 | 查询特定分块操作中的已上传/复制的块 |
Complete Multipart Upload | 完成分块上传/复制 | 完成整个文件的分块上传/复制 |
Abort Multipart Upload | 终止分块上传/复制 | 终止一个分块操作并删除已上传/复制的块 |
SDK API 参考
SDK 所有接口的具体参数与方法说明,请参考 SDK API。
高级接口(推荐)
复制对象
高级接口封装了简单复制、分块复制接口的异步请求,并支持暂停、恢复以及取消复制请求。
示例代码
Objective-C
QCloudCOSXMLCopyObjectRequest* request = [[QCloudCOSXMLCopyObjectRequest alloc] init];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";
// 文件来源存储桶,需要是公有读或者在当前账号有权限
request.sourceBucket = @"sourcebucket-1250000000";
// 源文件名称
request.sourceObject = @"sourceObject";
// 源文件的 APPID
request.sourceAPPID = @"1250000000";
// 来源的地域
request.sourceRegion= @"COS_REGION";
[request setFinishBlock:^(QCloudCopyObjectResult* result, NSError* error) {
// 可以从 outputObject 中获取 response 中 etag 或者自定义头部等信息
}];
// 注意如果是跨地域复制,这里使用的 transferManager 所在的 region 必须为目标桶所在的 region
[[QCloudCOSTransferMangerService defaultCOSTransferManager] CopyObject:request];
// 取消copy
// 若需要取消copy 调用cancel方法
[request cancel];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let copyRequest = QCloudCOSXMLCopyObjectRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
copyRequest.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
copyRequest.object = "exampleobject";
// 文件来源存储桶,需要是公有读或者在当前账号有权限
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
copyRequest.sourceBucket = "sourcebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
copyRequest.sourceObject = "sourceObject";
// 源文件的 APPID
copyRequest.sourceAPPID = "1250000000";
// 来源的地域
copyRequest.sourceRegion = "COS_REGION";
copyRequest.setFinish { (copyResult, error) in
if let copyResult = copyResult {
// 文件的 etag
let eTag = copyResult.eTag
} else {
print(error!);
}
}
// 注意如果是跨地域复制,这里使用的 transferManager 所在的 region 必须为目标桶所在的 region
QCloudCOSTransferMangerService.defaultCOSTransferManager().copyObject(copyRequest);
// 取消copy
// 若需要取消copy 调用cancel方法
copyRequest.cancel();
说明:更多完整示例,请前往 GitHub 查看。
移动对象
移动对象主要包括两个操作:复制源对象到目标位置,删除源对象。
由于 COS 通过存储桶名称(Bucket)和对象键(ObjectKey)来标识对象。移动对象也就意味着修改这个对象的标识,COS Java SDK 目前没有提供修改对象唯一标识名的单独接口,但是可以通过组合复制对象加上删除对象的基本操作,来达到修改对象标识的目的,从而实现移动对象。
例如将 mybucket-1250000000 这个存储桶中的 picture.jpg 这个对象移动到同个存储桶的 doc 路径下。首先可以复制 picture.jpg 对象到存储桶的 doc 路径下,即对象键设定为 doc/picture.jpg,复制完成后删除 picture.jpg 这个对象,来实现“移动”的效果。
同样的,如果想将 mybucket-1250000000 这个存储桶里的 picture.jpg 这个对象移动到 myanothorbucket-1250000000 这个存储桶里,可以先将对象复制到 myanothorbucket-1250000000 存储桶,然后删除原来的对象。
示例代码
Objective-C
QCloudCOSXMLCopyObjectRequest* request = [[QCloudCOSXMLCopyObjectRequest alloc] init];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
request.object = @"exampleobject";
// 文件来源存储桶,需要是公有读或者在当前账号有权限
request.sourceBucket = @"sourcebucket-1250000000";
// 源文件名称
request.sourceObject = @"sourceObject";
// 源文件的 APPID
request.sourceAPPID = @"1250000000";
// 来源的地域
request.sourceRegion= @"COS_REGION";
[request setFinishBlock:^(QCloudCopyObjectResult* result, NSError* error) {
// 可以从 outputObject 中获取 response 中 etag 或者自定义头部等信息
if(!error){
QCloudDeleteObjectRequest* deleteObjectRequest = [QCloudDeleteObjectRequest new];
// 文件来源存储桶,需要是公有读或者在当前账号有权限
deleteObjectRequest.bucket = @"sourcebucket-1250000000";
// 源文件名称,是源对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
deleteObjectRequest.object = @"sourceObject";
[deleteObjectRequest setFinishBlock:^(id outputObject, NSError *error) {
// outputObject 包含所有的响应 http 头部
NSDictionary* info = (NSDictionary *) outputObject;
}];
[[QCloudCOSXMLService defaultCOSXML] DeleteObject:deleteObjectRequest];
}
}];
// 注意如果是跨地域移动,这里使用的 transferManager 所在的 region 必须为目标桶所在的 region
[[QCloudCOSTransferMangerService defaultCOSTransferManager] CopyObject:request];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let copyRequest = QCloudCOSXMLCopyObjectRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
copyRequest.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
copyRequest.object = "exampleobject";
// 文件来源存储桶,需要是公有读或者在当前账号有权限
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
copyRequest.sourceBucket = "sourcebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
copyRequest.sourceObject = "sourceObject";
// 源文件的 APPID
copyRequest.sourceAPPID = "1250000000";
// 来源的地域
copyRequest.sourceRegion = "COS_REGION";
copyRequest.setFinish { (copyResult, error) in
if let copyResult = copyResult {
// 文件的 etag
let deleteObject = QCloudDeleteObjectRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
deleteObject.bucket = "sourcebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "dir1/object1"
deleteObject.object = "sourceObject";
deleteObject.finishBlock = {(result,error)in
if let result = result {
// result 包含响应的 header 信息
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().deleteObject(deleteObject);
} else {
print(error!);
}
}
// 注意如果是跨地域移动,这里使用的 transferManager 所在的 region 必须为目标桶所在的 region
QCloudCOSTransferMangerService.defaultCOSTransferManager().copyObject(copyRequest);
说明:更多完整示例,请前往 GitHub 查看。
简单操作
复制对象(修改属性)
复制文件到目标路径(PUT Object-Copy)。
示例代码一: 复制对象时保留对象属性
Objective-C
QCloudPutObjectCopyRequest* request = [[QCloudPutObjectCopyRequest alloc] init];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";
// 是否拷贝元数据,枚举值:Copy,Replaced,默认值 Copy。
// 假如标记为 Copy,忽略 Header 中的用户元数据信息直接复制
// 假如标记为 Replaced,按 Header 信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为 Replaced
request.metadataDirective = @"Copy";
// 定义 Object 的 ACL 属性,有效值:private,public-read,default。
// 默认值:default(继承 Bucket 权限)。
// 注意:如果您无需进行 Object ACL 控制,请填 default
// 或者此项不进行设置,默认继承 Bucket 权限。
request.accessControlList = @"default";
// 源对象所在的路径
request.objectCopySource =
@"sourcebucket-1250000000.cos.ap-guangzhou.myqcloud.com/sourceObject";
// 指定源文件的 versionID,只有开启或开启后暂停的存储桶,才会响应此参数
request.versionID = @"objectVersion1";
[request setFinishBlock:^(QCloudCopyObjectResult * _Nonnull result,
NSError * _Nonnull error) {
// result 返回具体信息
}];
[[QCloudCOSXMLService defaultCOSXML] PutObjectCopy:request];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let putObjectCopy = QCloudPutObjectCopyRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
putObjectCopy.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
putObjectCopy.object = "exampleobject";
// 源对象所在的路径
putObjectCopy.objectCopySource = "sourcebucket-1250000000.cos.ap-guangzhou.myqcloud.com/sourceObject";
// 是否拷贝元数据,枚举值:Copy,Replaced,默认值 Copy。
// 假如标记为 Copy,忽略 Header 中的用户元数据信息直接复制
// 假如标记为 Replaced,按 Header 信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为 Replaced
putObjectCopy.metadataDirective = "Copy";
// 定义 Object 的 ACL 属性,有效值:private,public-read,default。
// 默认值:default(继承 Bucket 权限)。
// 注意:如果您无需进行 Object ACL 控制,请填 default
// 或者此项不进行设置,默认继承 Bucket 权限。
putObjectCopy.accessControlList = "default";
// 指定源文件的 versionID,只有开启或开启后暂停的存储桶,才会响应此参数
putObjectCopy.versionID = "versionID";
putObjectCopy.setFinish { (result, error) in
if let result = result {
let eTag = result.eTag
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().putObjectCopy(putObjectCopy);
说明:更多完整示例,请前往 GitHub 查看。
示例代码二: 复制对象时替换对象属性
Objective-C
QCloudPutObjectCopyRequest* request = [[QCloudPutObjectCopyRequest alloc] init];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";
// 是否拷贝元数据,枚举值:Copy,Replaced,默认值 Copy。
// 假如标记为 Copy,忽略 Header 中的用户元数据信息直接复制
// 假如标记为 Replaced,按 Header 信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为 Replaced
request.metadataDirective = @"Replaced";
// 修改元数据
[request.customHeaders setValue:@"newValue" forKey:@"x-cos-meta-*"];
// 对象存储类型,枚举值请参见 存储类型概述 文档,例如 MAZ_STANDARD,MAZ_STANDARD_IA,
// STANDARD_IA,ARCHIVE。仅当对象不是标准存储(STANDARD)时才会返回该头部
// 修改存储类型
[request.customHeaders setValue:@"newValue" forKey:@"x-cos-storage-class"];
// 定义 Object 的 ACL 属性,有效值:private,public-read,default。
// 默认值:default(继承 Bucket 权限)。
// 注意:如果您无需进行 Object ACL 控制,请填 default
// 或者此项不进行设置,默认继承 Bucket 权限。
// 修改acl
request.accessControlList = @"private";
// 源对象所在的路径
request.objectCopySource =
@"sourcebucket-1250000000.cos.ap-guangzhou.myqcloud.com/sourceObject";
// 指定源文件的 versionID,只有开启或开启后暂停的存储桶,才会响应此参数
request.versionID = @"objectVersion1";
[request setFinishBlock:^(QCloudCopyObjectResult * _Nonnull result,
NSError * _Nonnull error) {
// result 返回具体信息
}];
[[QCloudCOSXMLService defaultCOSXML] PutObjectCopy:request];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let request : QCloudPutObjectCopyRequest = QCloudPutObjectCopyRequest();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = "exampleobject";
// 是否拷贝元数据,枚举值:Copy,Replaced,默认值 Copy。
// 假如标记为 Copy,忽略 Header 中的用户元数据信息直接复制
// 假如标记为 Replaced,按 Header 信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为 Replaced
request.metadataDirective = "Replaced";
// 修改元数据
request.customHeaders.setValue("newValue", forKey: "x-cos-meta-*");
// 对象存储类型,枚举值请参见 存储类型概述 文档,例如 MAZ_STANDARD,MAZ_STANDARD_IA,
// STANDARD_IA,ARCHIVE。仅当对象不是标准存储(STANDARD)时才会返回该头部
// 修改存储类型
request.customHeaders.setValue("newValue", forKey: "x-cos-storage-class");
// 定义 Object 的 ACL 属性,有效值:private,public-read,default。
// 默认值:default(继承 Bucket 权限)。
// 注意:如果您无需进行 Object ACL 控制,请填 default
// 或者此项不进行设置,默认继承 Bucket 权限。
// 修改acl
request.accessControlList = "源文件acl";
// 源对象所在的路径
request.objectCopySource = "sourcebucket-1250000000.cos.ap-guangzhou.myqcloud.com/sourceObject";
// 指定源文件的 versionID,只有开启或开启后暂停的存储桶,才会响应此参数
request.versionID = "versionID";
request.setFinish { (result, error) in
if let result = result {
let eTag = result.eTag
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().putObjectCopy(request);
说明:更多完整示例,请前往 GitHub 查看。
示例代码三: 修改对象元数据
Objective-C
QCloudPutObjectCopyRequest* request = [[QCloudPutObjectCopyRequest alloc] init];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";
// 是否拷贝元数据,枚举值:Copy,Replaced,默认值 Copy。
// 假如标记为 Copy,忽略 Header 中的用户元数据信息直接复制
// 假如标记为 Replaced,按 Header 信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为 Replaced
request.metadataDirective = @"Replaced";
// 自定义对象header
[request.customHeaders setValue:@"newValue" forKey:@"x-cos-meta-*"];
// 定义 Object 的 ACL 属性,有效值:private,public-read,default。
// 默认值:default(继承 Bucket 权限)。
// 注意:如果您无需进行 Object ACL 控制,请填 default
// 或者此项不进行设置,默认继承 Bucket 权限。
request.accessControlList = @"default";
// 源对象所在的路径
request.objectCopySource =
@"examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/exampleobject";
[request setFinishBlock:^(QCloudCopyObjectResult * _Nonnull result,
NSError * _Nonnull error) {
// result 返回具体信息
}];
[[QCloudCOSXMLService defaultCOSXML] PutObjectCopy:request];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let request : QCloudPutObjectCopyRequest = QCloudPutObjectCopyRequest();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = "exampleobject";
// 是否拷贝元数据,枚举值:Copy,Replaced,默认值 Copy。
// 假如标记为 Copy,忽略 Header 中的用户元数据信息直接复制
// 假如标记为 Replaced,按 Header 信息修改元数据。当目标路径和原路径一致
// 即用户试图修改元数据时,必须为 Replaced
request.metadataDirective = "Replaced";
// 自定义对象header
request.customHeaders.setValue("newValue", forKey: "x-cos-meta-*")
// 定义 Object 的 ACL 属性,有效值:private,public-read,default。
// 默认值:default(继承 Bucket 权限)。
// 注意:如果您无需进行 Object ACL 控制,请填 default
// 或者此项不进行设置,默认继承 Bucket 权限。
request.accessControlList = "default";
// 源对象所在的路径
request.objectCopySource =
"examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/exampleobject";
request.setFinish { (result, error) in
if let result = result {
// 生成的新文件的 etag
let eTag = result.eTag
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().putObjectCopy(request);
说明:更多完整示例,请前往 GitHub 查看。
示例代码四: 修改对象存储类型
Objective-C
QCloudPutObjectCopyRequest* request = [[QCloudPutObjectCopyRequest alloc] init];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";
// 对象存储类型,枚举值请参见 存储类型概述 文档,例如 MAZ_STANDARD,MAZ_STANDARD_IA,
// STANDARD_IA,ARCHIVE。仅当对象不是标准存储(STANDARD)时才会返回该头部
[request.customHeaders setValue:@"ARCHIVE" forKey:@"x-cos-storage-class"];
// 源对象所在的路径
request.objectCopySource =
@"examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/exampleobject";
// 指定源文件的 versionID,只有开启或开启后暂停的存储桶,才会响应此参数
request.versionID = @"";
[request setFinishBlock:^(QCloudCopyObjectResult * _Nonnull result,
NSError * _Nonnull error) {
// result 返回具体信息
}];
[[QCloudCOSXMLService defaultCOSXML] PutObjectCopy:request];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let request : QCloudPutObjectCopyRequest = QCloudPutObjectCopyRequest();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = "exampleobject";
// 对象存储类型,枚举值请参见 存储类型概述 文档,例如 MAZ_STANDARD,MAZ_STANDARD_IA,
// STANDARD_IA,ARCHIVE。仅当对象不是标准存储(STANDARD)时才会返回该头部
request.customHeaders.setValue("newValue", forKey: "x-cos-storage-class");
// 源对象所在的路径
request.objectCopySource =
"examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/exampleobject";
request.setFinish { (result, error) in
if let result = result {
// 生成的新文件的 etag
let eTag = result.eTag
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().putObjectCopy(request);
说明:更多完整示例,请前往 GitHub 查看。
分块操作
这里主要介绍分块复制的流程。分块复制和分块上传在涉及接口及使用上具有一定重合度。
分块复制的流程
- 初始化分块复制(Initiate Multipart Upload),得到 UploadId。
- 使用 UploadId 复制分块(Upload Part - Copy)。
- 完成分块复制(Complete Multipart Upload)。
分块复制的流程
- 如果没有记录 UploadId,查询分块复制任务(List Multipart Uploads),得到对应文件的 UploadId。
- 使用 UploadId 列出已复制的分块(List Parts)。
- 使用 UploadId 复制剩余的分块(Upload Part Copy)。
- 完成分块复制(Complete Multipart Upload)。
终止分块复制的流程
- 如果没有记录 UploadId,查询分块复制任务(List Multipart Upload),得到对应文件的 UploadId
- 终止分块复制并删除已复制分块(Abort Multipart Upload)
查询分块复制
功能说明
查询指定存储桶中正在进行的分块复制(List Multipart Uploads),该接口与分块上传的查询分块上传接口一致。
示例代码
Objective-C
QCloudListBucketMultipartUploadsRequest* uploads = [QCloudListBucketMultipartUploadsRequest new];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
uploads.bucket = @"examplebucket-1250000000";
// 设置最大返回的 multipart 数量,合法取值从 1 到 1000
uploads.maxUploads = 100;
[uploads setFinishBlock:^(QCloudListMultipartUploadsResult* result,
NSError *error) {
// 可以从 result 中返回分块信息
// 进行中的分块复制对象
NSArray<QCloudListMultipartUploadContent*> *uploads = result.uploads;
}];
[[QCloudCOSXMLService defaultCOSXML] ListBucketMultipartUploads:uploads];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let listParts = QCloudListBucketMultipartUploadsRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
listParts.bucket = "examplebucket-1250000000";
// 设置最大返回的 multipart 数量,合法取值从 1 到 1000
listParts.maxUploads = 100;
listParts.setFinish { (result, error) in
if let result = result {
// 未完成的所有分块复制任务
let uploads = result.uploads;
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().listBucketMultipartUploads(listParts);
说明:更多完整示例,请前往 GitHub 查看。
初始化分块复制
功能说明
初始化 Multipart Upload 复制操作,获取对应的 uploadId(Initiate Multipart Upload),该接口与分块上传的初始化分块上传接口一致。
示例代码
Objective-C
QCloudInitiateMultipartUploadRequest* initRequest = [QCloudInitiateMultipartUploadRequest new];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
initRequest.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
initRequest.object = @"exampleobject";
// 将作为对象的元数据返回
initRequest.cacheControl = @"cacheControl";
initRequest.contentDisposition = @"contentDisposition";
// 定义 Object 的 ACL 属性。有效值:private,public-read-write,public-read;默认值:private
initRequest.accessControlList = @"public";
// 赋予被授权者读的权限。
initRequest.grantRead = @"grantRead";
// 赋予被授权者全部权限
initRequest.grantFullControl = @"grantFullControl";
[initRequest setFinishBlock:^(QCloudInitiateMultipartUploadResult* outputObject,
NSError *error) {
// 获取分块复制的 uploadId,后续的分块复制都需要这个 ID,请保存以备后续使用
self->uploadId = outputObject.uploadId;
}];
[[QCloudCOSXMLService defaultCOSXML] InitiateMultipartUpload:initRequest];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let initRequest = QCloudInitiateMultipartUploadRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
initRequest.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
initRequest.object = "exampleobject";
initRequest.setFinish { (result, error) in
if let result = result {
// 获取分块复制的 uploadId,后续的分块复制都需要这个 ID,请保存以备后续使用
self.uploadId = result.uploadId;
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().initiateMultipartUpload(initRequest);
说明:更多完整示例,请前往 GitHub 查看。
复制分块
功能说明
将其他对象复制为一个分块 (Upload Part-Copy)。
示例代码
Objective-C
QCloudUploadPartCopyRequest* request = [[QCloudUploadPartCopyRequest alloc] init];
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";
// 源文件 URL 路径,可以通过 versionid 子资源指定历史版本
request.source = @"sourcebucket-1250000000.cos.ap-guangzhou.myqcloud.com/sourceObject";
// 在初始化分块复制的响应中,会返回一个唯一的描述符(upload ID)
request.uploadID = uploadId;
// 标志当前分块的序号
request.partNumber = 1;
[request setFinishBlock:^(QCloudCopyObjectResult* result, NSError* error) {
QCloudMultipartInfo *part = [QCloudMultipartInfo new];
// 获取所复制分块的 etag
part.eTag = result.eTag;
part.partNumber = @"1";
// 保存起来用于最后完成复制时使用
self.parts=@[part];
}];
[[QCloudCOSXMLService defaultCOSXML]UploadPartCopy:request];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let req = QCloudUploadPartCopyRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
req.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
req.object = "exampleobject";
// 源文件 URL 路径,可以通过 versionid 子资源指定历史版本
req.source = "sourcebucket-1250000000.cos.ap-guangzhou.myqcloud.com/sourceObject";
// 在初始化分块复制的响应中,会返回一个唯一的描述符(upload ID)
if let uploadId = self.uploadId {
req.uploadID = uploadId;
}
// 标志当前分块的序号
req.partNumber = 1;
req.setFinish { (result, error) in
if let result = result {
let mutipartInfo = QCloudMultipartInfo.init();
// 获取所复制分块的 etag
mutipartInfo.eTag = result.eTag;
mutipartInfo.partNumber = "1";
// 保存起来用于最后完成复制时使用
self.parts = [mutipartInfo];
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().uploadPartCopy(req);
说明:更多完整示例,请前往 GitHub 查看。
查询已复制的分块
功能说明
查询特定分块复制操作中的已复制的块(List Parts),该接口与分块上传的查询已上传的分块接口一致。
示例代码
Objective-C
QCloudListMultipartRequest* request = [QCloudListMultipartRequest new];
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
request.object = @"exampleobject";
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
request.bucket = @"examplebucket-1250000000";
// 在初始化分块复制的响应中,会返回一个唯一的描述符(upload ID)
request.uploadId = uploadId;
[request setFinishBlock:^(QCloudListPartsResult * _Nonnull result,
NSError * _Nonnull error) {
// 从 result 中获取已复制分块信息
// 用来表示每一个块的信息
NSArray<QCloudMultipartUploadPart*> *parts = result.parts;
}];
[[QCloudCOSXMLService defaultCOSXML] ListMultipart:request];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let req = QCloudListMultipartRequest.init();
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
req.object = "exampleobject";
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
req.bucket = "examplebucket-1250000000";
// 在初始化分块复制的响应中,会返回一个唯一的描述符(upload ID)
if let uploadId = self.uploadId {
req.uploadId = uploadId;
}
req.setFinish { (result, error) in
if let result = result {
// 所有已完成的分片
let parts = result.parts
} else {
print(error!);
}
}
QCloudCOSXMLService.defaultCOSXML().listMultipart(req);
说明:更多完整示例,请前往 GitHub 查看。
完成分块复制
功能说明
完成整个文件的分块复制(Complete Multipart Upload),该接口与分块上传的完成分块上传接口一致。
示例代码
Objective-C
QCloudCompleteMultipartUploadRequest *completeRequst = [QCloudCompleteMultipartUploadRequest new];
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
completeRequst.object = @"exampleobject";
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
completeRequst.bucket = @"examplebucket-1250000000";
// 本次要查询的分块复制的 uploadId,可从初始化分块复制的请求结果 QCloudInitiateMultipartUploadResult 中得到
completeRequst.uploadId = uploadId;
// 已复制分块的信息
QCloudCompleteMultipartUploadInfo *partInfo = [QCloudCompleteMultipartUploadInfo new];
NSMutableArray * parts = [self.parts mutableCopy];
// 对已复制的块进行排序
[parts sortUsingComparator:^NSComparisonResult(QCloudMultipartInfo* _Nonnull obj1,
QCloudMultipartInfo* _Nonnull obj2) {
int a = obj1.partNumber.intValue;
int b = obj2.partNumber.intValue;
if (a < b) {
return NSOrderedAscending;
} else {
return NSOrderedDescending;
}
}];
partInfo.parts = [parts copy];
completeRequst.parts = partInfo;
[completeRequst setFinishBlock:^(QCloudUploadObjectResult * _Nonnull result,
NSError * _Nonnull error) {
// 从 result 中获取复制结果
}];
[[QCloudCOSXMLService defaultCOSXML] CompleteMultipartUpload:completeRequst];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let complete = QCloudCompleteMultipartUploadRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
complete.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
complete.object = "exampleobject";
// 本次要查询的分块复制的 uploadId,可从初始化分块复制的请求结果
// QCloudInitiateMultipartUploadResult 中得到
complete.uploadId = "exampleUploadId";
if let uploadId = self.uploadId {
complete.uploadId = uploadId;
}
// 已复制分块的信息
let completeInfo = QCloudCompleteMultipartUploadInfo.init();
if self.parts == nil {
print("没有要完成的分块");
return;
}
if self.parts != nil {
completeInfo.parts = self.parts ?? [];
}
complete.parts = completeInfo;
complete.setFinish { (result, error) in
// 从 result 中获取复制结果
}
QCloudCOSXMLService.defaultCOSXML().completeMultipartUpload(complete);
说明:更多完整示例,请前往 GitHub 查看。
终止分块复制
功能说明
终止一个分块复制操作并删除已复制的块(Abort Multipart Upload),该接口与分块上传的终止分块上传接口一致。
示例代码
Objective-C
QCloudAbortMultipfartUploadRequest *abortRequest = [QCloudAbortMultipfartUploadRequest new];
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
abortRequest.object = @"exampleobject";
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
abortRequest.bucket = @"examplebucket-1250000000";
// 本次要终止的分块复制的 uploadId
// 可从初始化分块复制的请求结果 QCloudInitiateMultipartUploadResult 中得到
abortRequest.uploadId = @"exampleUploadId";
[abortRequest setFinishBlock:^(id outputObject, NSError *error) {
// 可以从 outputObject 中获取 response 中 etag 或者自定义头部等信息
NSDictionary * result = (NSDictionary *)outputObject;
}];
[[QCloudCOSXMLService defaultCOSXML]AbortMultipfartUpload:abortRequest];
说明:更多完整示例,请前往 GitHub 查看。
Swift
let abort = QCloudAbortMultipfartUploadRequest.init();
// 存储桶名称,由BucketName-Appid 组成,可以在COS控制台查看 https://console.cloud.tencent.com/cos5/bucket
abort.bucket = "examplebucket-1250000000";
// 对象键,是对象在 COS 上的完整路径,如果带目录的话,格式为 "video/xxx/movie.mp4"
abort.object = "exampleobject";
// 本次要查询的分块复制的 uploadId,可从初始化分块复制的请求结果
// QCloudInitiateMultipartUploadResult 中得到
abort.uploadId = self.uploadId!;
abort.finishBlock = {(result,error)in
if let result = result {
// 可以从 result 中获取服务器返回的 header 信息
} else {
print(error!)
}
}
QCloudCOSXMLService.defaultCOSXML().abortMultipfartUpload(abort);
说明:更多完整示例,请前往 GitHub 查看。