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

对象存储

复制全文
下载 pdf
下载对象
断点续传(iOS SDK)
复制全文
下载 pdf
断点续传(iOS SDK)
断点续传适用于大文件传输或网络不稳定的场景。TOS iOS SDK 将对象拆分为多个分片并保存至 checkpoint。任务暂停或异常中断后,再次发起相同请求即可从已完成的分片继续传输,无需重新传输整个文件。​
前提条件​
  • 已准备可用的 Endpoint、Region 和 Bucket。​
  • 确保上传源文件路径、下载目标目录及 checkpoint 目录均可正常访问。​
  • 示例代码使用 Objective-C,可放入工程的 .m 文件中。​
注意事项​
​
注意事项​
说明​
版本与接口兼容性​
  • 断点续传的下载请使用 TOSDownloadFileInput SDK接口。​
  • 当前断点续传接口不支持 SSE 相关参数。​
任务管理​
  • 同一 checkpoint 路径不能同时用于多个传输任务,恢复前应等待原任务结束。​
  • 恢复任务时,Bucket、Object、文件路径、分片大小、版本号和条件参数等必须与原任务保持一致。​
  • 每次恢复传输任务均需创建新的请求对象和 TOSCancelHook。​
  • checkpoint 不包含访问凭证,也不保证与其他语言的 SDK 互通。​
运行环境​
  • 断点续传沿用前台传输边界:App 进入后台或进程被系统终止后不保证继续执行,下次启动可通过 checkpoint 恢复。​
  • 下载临时文件与目标文件必须位于同一文件系统,建议放在目标文件的同一目录下。​
  • 传输进度和事件回调可能在后台线程执行,更新 UI 时请切换到主线程。​
续传状态管理​
下载成功完成后 SDK 会自动删除 checkpoint。​
  • cancel:NO 保留续传状态。​
  • cancel:YES 清理续传状态。​
​
准备 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];​
}​
​
示例代码​
下载数据会先写入临时文件。所有分片下载并校验成功后,SDK 才会原子替换目标文件,因此暂停或传输失败不会破坏已有目标文件。​
创建下载请求​
​
static TOSDownloadFileInput *TOSCreateDownloadInput(​
NSString *bucket,​
NSString *objectKey,​
NSString *filePath,​
NSString *checkpointPath,​
TOSCancelHook *cancelHook) {​
​
TOSDownloadFileInput *input = [TOSDownloadFileInput new];​
input.tosBucket = bucket;​
input.tosKey = objectKey;​
input.tosFilePath = filePath;​
// 临时文件必须与目标文件位于同一文件系统,建议使用同一目录。​
input.tosTempFilePath = [filePath stringByAppendingString:@".temp"];​
// 分片大小。设置为 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;= ^(TOSDataTransferStatus *status) {​
if (status.tosTotalBytes <= 0) {​
return;​
}​
double progress =​
status.tosConsumedBytes * 100.0 / status.tosTotalBytes;​
dispatch_async(dispatch_get_main_queue(), ^{​
NSLog(@"Download progress: %.2f%%", progress);​
// 在此更新进度条。​
});​
};​
return input;​
}​
​
开始下载​
​
NSString *bucket = @"YOUR_BUCKET";​
NSString *objectKey = @"example/large-file.bin";​
NSString *downloadFilePath = @"YOUR_DOWNLOAD_FILE_PATH";​
NSString *downloadCheckpoint = TOSCheckpointPath(@"download-large-file.json");​
​
TOSCancelHook *downloadCancelHook = [TOSCancelHook new];​
TOSDownloadFileInput *downloadInput =​
TOSCreateDownloadInput(bucket,​
objectKey,​
downloadFilePath,​
downloadCheckpoint,​
downloadCancelHook);​
​
TOSTask *downloadTask = [client downloadFile:downloadInput];​
[downloadTask continueWithBlock:^id(TOSTask *finishedTask) {​
if (finishedTask.error) {​
NSLog(@"Download file failed: %@", finishedTask.error);​
return nil;​
}​
​
NSLog(@"Download file succeeded: %@", downloadFilePath);​
return nil;​
}];​
​
暂停并恢复下载​
当用户触发暂停操作时,调用以下接口暂停下载任务:​
​
// 暂停下载并保留 checkpoint 和临时文件。​
[downloadCancelHook cancel:NO];​
​
等待原任务完成回调后,使用相同参数重新创建请求:​
​
TOSCancelHook *newDownloadCancelHook = [TOSCancelHook new];​
TOSDownloadFileInput *resumedDownloadInput =​
TOSCreateDownloadInput(bucket,​
objectKey,​
downloadFilePath,​
downloadCheckpoint,​
newDownloadCancelHook);​
​
TOSTask *resumedDownloadTask = [client downloadFile:resumedDownloadInput];​
[resumedDownloadTask continueWithBlock:^id(TOSTask *finishedTask) {​
if (finishedTask.error) {​
NSLog(@"Resume download failed: %@", finishedTask.error);​
} else {​
NSLog(@"Resume download succeeded: %@", downloadFilePath);​
}​
return nil;​
}];​
​
终止任务​
调用 TOSCancelHook 可立即终止任务并清理续传状态,终止后再次调用对应接口时任务将从头开始。​
通过各自请求中的 TOSCancelHook 终止任务:​
​
// 终止下载​
[downloadCancelHook cancel:YES];​
​
注意​
请勿在任务成功或已经终止后继续复用旧的 TOSCancelHook。​
最近更新时间:2026.09.29 16:01:36
这个页面对您有帮助吗?
有用
有用
无用
无用