You need to enable JavaScript to run this app.
文档中心
对象存储

对象存储

复制全文
下载 pdf
管理对象
拷贝对象(iOS SDK)
复制全文
下载 pdf
拷贝对象(iOS SDK)
本文介绍拷贝对象的示例代码。拷贝不支持跨地域的拷贝,并且要求对原对象拥有读权限。​
前提条件​
  • 已准备可用的 Endpoint、Region 和 Bucket。​
  • 确保上传源文件路径、下载目标目录及 checkpoint 目录均可正常访问。​
  • 示例代码使用 Objective-C,可放入工程的 .m 文件中。​
注意事项​
​
注意事项​
说明​
版本与接口兼容性​
当前断点续传接口不支持 SSE 相关参数。​
任务管理​
  • 同一 checkpoint 路径不能同时用于多个传输任务,恢复前应等待原任务结束。​
  • 恢复任务时,Bucket、Object、文件路径、分片大小、版本号和条件参数等必须与原任务保持一致。​
  • 每次恢复传输任务均需创建新的请求对象和 TOSCancelHook。​
  • checkpoint 不包含访问凭证,也不保证与其他语言的 SDK 互通。​
运行环境​
  • 断点续传沿用前台传输边界:App 进入后台或进程被系统终止后不保证继续执行,下次启动可通过 checkpoint 恢复。​
  • 传输进度进度和事件回调可能在后台线程执行,更新 UI 时请切换到主线程。​
续传状态管理​
拷贝成功完成后 SDK 会自动删除 checkpoint。​
  • cancel:NO 保留续传状态。​
  • cancel:YES 清理续传状态。​
​
普通拷贝​
如下代码展示如何在同一个桶内拷贝对象。​
​
// 从STS服务获取的临时访问密钥和安全令牌(AccessKey、SecretKey、SecurityToken)​
TOSCredential *credential = [[TOSCredential alloc] initWithAccessKey:@"accesskey" secretKey:@"secretkey" securityToken:@"securityToken"];​
TOSEndpoint *tosEndpoint = [[TOSEndpoint alloc] initWithURLString:@"endpoint" withRegion:@"region"];​
TOSClientConfiguration *config = [[TOSClientConfiguration alloc] initWithEndpoint:tosEndpoint credential:credential];​
TOSClient *client = [[TOSClient alloc] initWithConfiguration:config];​
​
TOSCopyObjectInput *input = [[TOSCopyObjectInput alloc] init];​
input.tosBucket = @"bucket-name";​
input.tosSrcBucket = @"src-bucket-name";​
input.tosKey = @"object-name";​
input.tosSrcKey = @"src-object-name";​
input.tosMeta = @{@"new-meta-key" : @"new-meta-value"};​
input.tosMetadataDirective = TOSMetadataDirectiveReplace;​
​
TOSTask *task = [client copyObject:input];​
[task continueWithBlock:^id(TOSTask *task) {​
if (!task.error) {​
NSLog(@"Copy object success.");​
} else {​
NSLog(@"Copy object failed, error: %@" ,task.error);​
}​
return nil;​
}];​
​
分片拷贝​
拷贝大对象时,可通过 UploadPartCopy 实现分片复制,操作步骤如下:​
  1. 调用 CreateMultipartUpload 初始化分片复制任务。​
  1. 调用 UploadPartCopy 执行分片复制。​
  1. 调用 CompleteMultipartUpload 合并分片。​
​
TOSCredential *credential = [[TOSCredential alloc] initWithAccessKey:@"accesskey" secretKey:@"secretkey"];​
TOSEndpoint *tosEndpoint = [[TOSEndpoint alloc] initWithURLString:@"endpoint" withRegion:@"region"];​
TOSClientConfiguration *config = [[TOSClientConfiguration alloc] initWithEndpoint:tosEndpoint credential:credential];​
TOSClient *client = [[TOSClient alloc] initWithConfiguration:config];​
​
// 1. CreateMultipartUpload​
TOSCreateMultipartUploadInput *create = [TOSCreateMultipartUploadInput new];​
create.tosBucket = @"bucket-name";​
create.tosKey = @"object-name";​
task = [client createMultipartUpload:create];​
[task waitUntilFinished];​
TOSCreateMultipartUploadOutput *createOutput = task.result;​
​
// 2. UploadPartCopy​
TOSUploadPartCopyInput *part1 = [TOSUploadPartCopyInput new];​
part1.tosBucket = @"bucket-name";​
part1.tosKey = @"object-name";​
part1.tosSrcBucket = @"src-bucket-name";​
part1.tosSrcKey = @"src-object-name";​
part1.tosCopySourceRangeStart = @0;​
part1.tosPartNumber = 1;​
task = [client uploadPartCopy:part1];​
[task waitUntilFinished];​
TOSUploadPartCopyOutput *uploadOutput = task.result;​
uploadOutput.tosETag = [uploadOutput.tosETag stringByReplacingOccurrencesOfString:@"\"" withString:@""];​
​
// 3. CompleteMultipartUpload​
TOSCompleteMultipartUploadInput *complete = [TOSCompleteMultipartUploadInput new];​
complete.tosBucket = createOutput.bucket;​
complete.tosKey = createOutput.key;​
complete.tosUploadId = createOutput.uploadId;​
​
NSMutableArray *array = [NSMutableArray array];​
TOSUploadedPart *uploadedPart1 = [TOSUploadedPart new];​
uploadedPart1.tosPartNumber = uploadOutput.tosPartNumber;​
uploadedPart1.tosETag = uploadOutput.tosETag;​
[array addObject:uploadedPart1];​
​
complete.parts = array;​
task = [client completeMultipartUpload:complete];​
[task waitUntilFinished];​
TOSCompleteMultipartUploadOutput *comleteOutput = task.result;​
​
断点续传拷贝​
断点续传拷贝在 TOS 服务端完成,无需先把源对象下载到本地。源对象和目标对象可以位于不同的桶中。​
准备 checkpoint 路径​
每个传输任务必须使用独立的 checkpoint 路径。以下示例将 checkpoint 保存在 App 的 Application Support 目录中:​
​
static NSString *TOSCheckpointPath(NSString *fileName) {​
NSFileManager *fileManager = [NSFileManager defaultManager];​
NSURL *baseURL = [[fileManager URLsForDirectory:NSApplicationSupportDirectory​
inDomains:NSUserDomainMask] firstObject];​
NSURL *directoryURL = [baseURL URLByAppendingPathComponent:@"TOSCheckpoints"​
isDirectory:YES];​
​
NSError *error = nil;​
BOOL created = [fileManager createDirectoryAtURL:directoryURL​
withIntermediateDirectories:YES​
attributes:nil​
error:&error];​
if (!created) {​
NSLog(@"Create checkpoint directory failed: %@", error);​
return nil;​
}​
return [[directoryURL URLByAppendingPathComponent:fileName] path];​
}​
​
创建复制请求​
​
static TOSResumableCopyObjectInput *TOSCreateCopyInput(​
NSString *sourceBucket,​
NSString *sourceObjectKey,​
NSString *destinationBucket,​
NSString *destinationObjectKey,​
NSString *checkpointPath,​
TOSCancelHook *cancelHook) {​
​
TOSResumableCopyObjectInput *input =​
[TOSResumableCopyObjectInput new];​
input.tosSrcBucket = sourceBucket;​
input.tosSrcKey = sourceObjectKey;​
input.tosBucket = destinationBucket;​
input.tosKey = destinationObjectKey;​
// 分片大小。设置为 0 时使用默认值 20 MiB,有效范围为 5 MiB~5 GiB。​
input.tosPartSize = 20LL * 1024 * 1024; ​
// 单个任务的分片并发数,默认值为 1,取值会归一化到 1 ~ 1000。​
input.tosTaskNum = 3;​
input.tosEnableCheckpoint = YES;​
// checkpoint 文件或目录路径。建议使用能够跨 App 启动保留的本地目录,并为每个任务分配独立路径。​
input.tosCheckpointFile = checkpointPath; ​
// 初始化请求和单个分片请求的最大重试次数,默认值为 3;设置为 0 表示关闭重试。​
input.tosMaxRetryCount = 3;​
input.tosCancelHook = cancelHook;​
​
// 复制提供分片事件,不提供字节级进度回调。​
input.tosCopyEventListener = ^(TOSCopyEvent *event) {​
if (event.tosType == TOSCopyEventUploadPartCopySucceed) {​
NSLog(@"Copy part succeeded: %d",​
event.tosCopyPartInfo.tosPartNumber);​
} else if (event.tosType == TOSCopyEventUploadPartCopyFailed) {​
NSLog(@"Copy part failed: %@", event.tosErr);​
}​
};​
return input;​
}​
​
开始复制​
​
NSString *sourceBucket = @"YOUR_SOURCE_BUCKET";​
NSString *sourceObjectKey = @"example/source-large-file.bin";​
NSString *destinationBucket = @"YOUR_DESTINATION_BUCKET";​
NSString *destinationObjectKey = @"example/copied-large-file.bin";​
NSString *copyCheckpoint = TOSCheckpointPath(@"copy-large-file.json");​
​
TOSCancelHook *copyCancelHook = [TOSCancelHook new];​
TOSResumableCopyObjectInput *copyInput =​
TOSCreateCopyInput(sourceBucket,​
sourceObjectKey,​
destinationBucket,​
destinationObjectKey,​
copyCheckpoint,​
copyCancelHook);​
​
TOSTask *copyTask = [client resumableCopyObject:copyInput];​
[copyTask continueWithBlock:^id(TOSTask *finishedTask) {​
if (finishedTask.error) {​
NSLog(@"Copy object failed: %@", finishedTask.error);​
return nil;​
}​
​
TOSResumableCopyObjectOutput *output = finishedTask.result;​
NSLog(@"Copy object succeeded, ETag: %@", output.tosETag);​
return nil;​
}];​
​
暂停并恢复复制​
当用户触发暂停操作时,调用以下接口暂停拷贝任务:​
​
// 暂停复制,保留 checkpoint 和远端分片任务。​
[copyCancelHook cancel:NO];​
​
等待原任务完成回调后,复用相同源对象、目标对象、分片大小和 checkpoint 路径:​
​
TOSCancelHook *newCopyCancelHook = [TOSCancelHook new];​
TOSResumableCopyObjectInput *resumedCopyInput =​
TOSCreateCopyInput(sourceBucket,​
sourceObjectKey,​
destinationBucket,​
destinationObjectKey,​
copyCheckpoint,​
newCopyCancelHook);​
​
TOSTask *resumedCopyTask = [client resumableCopyObject:resumedCopyInput];​
[resumedCopyTask continueWithBlock:^id(TOSTask *finishedTask) {​
if (finishedTask.error) {​
NSLog(@"Resume copy failed: %@", finishedTask.error);​
} else {​
NSLog(@"Resume copy succeeded");​
}​
return nil;​
}];​
​
终止任务​
调用 TOSCancelHook 可立即终止任务并清理续传状态,终止后再次调用对应接口时任务将从头开始。​
通过各自请求中的 TOSCancelHook 终止任务:​
​
// 终止复制​
[copyCancelHook cancel:YES];​
​
注意​
请勿在任务成功或已经终止后继续复用旧的 TOSCancelHook。​
最近更新时间:2026.09.29 16:01:16
这个页面对您有帮助吗?
有用
有用
无用
无用