在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,iOS SDK提供了断点续传上传功能。
背景信息
对于移动端而言,如果不是大文件(例如小于5 GB的文件),不建议使用断点续传的方式上传。断点续传上传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。对于通过断点续传的方式上传大于5 GB的文件时:
- 断点续传上传前
通过断点续传上传的方式将文件上传到OSS前,您可以指定断点记录的保存文件夹。断点续传上传仅在本次上传生效。
- 如果未指定断点记录的保存文件夹,假设某个分片因为网络原因等导致文件上传失败时,将耗用大量的重试时间及流量来重新上传整个大文件。
- 如果指定了断点记录的保存文件夹,在文件上传失败时,将从断点记录处继续上传未上传完成的部分。
- 断点续传上传时
- 断点续传上传仅支持上传本地文件。断点续传上传支持上传回调,使用方法与常见的上传回调类似。具体操作,请参见Callback。
- 断点续传上传依赖InitMultipartUpload、UploadPart、ListParts、CompleteMultipartUpload、AbortMultipartUpload等接口来实现。如果您需要通过STS鉴权模式来使用断点续传上传,则需要保证您拥有访问以上API接口的权限。
- 断点续传上传默认已开启每个分片上传时的MD5校验,因此无需在请求中设置
Content-Md5
头部。 - 如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。此时,您可以为Bucket设置lifeCycle规则的方式来定时清理碎片,详情请参见生命周期管理。 重要 出于碎片管理的原因,如果在断点续传时取消当前上传任务,默认会同步清理已经上传到服务器的分片。取消上传任务时如果仍希望保留断点上传记录,则需要指定断点记录的保存文件夹并修改deleteUploadIdOnCancelling参数。如果服务端保留记录时间过长,且Bucket已设置lifeCycle规则定时清理了服务端分片,会出现服务端和移动端记录不一致的问题。
示例代码
- 断点记录在本地持久保存时,调用
resumableUpload
方法实现断点续传上传的过程如下:OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = OSS_BUCKET_PRIVATE; //... NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; resumableUpload.recordDirectoryPath = cachesDir;
说明 使用断点续传上传文件失败时会生成断点记录文件,然后从断点记录处继续上传直到上传完成。上传成功后会自动删除断点记录文件,默认情况下不会在本地持久保存断点记录。
- 断点续传上传的完整示例代码如下:
// 获取UploadId上传文件。OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];resumableUpload.bucketName = ;// objectKey等同于objectName,表示断点上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpgresumableUpload.objectKey = ;resumableUpload.partSize = 1024 * 1024;resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);};NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];// 设置断点记录保存路径。resumableUpload.recordDirectoryPath = cachesDir;// 将参数deleteUploadIdOnCancelling设置为NO,表示不删除断点记录文件,上传失败后将从断点记录处继续上传直到文件上传完成。如果不设置此参数,即保留默认值YES,表示删除断点记录文件,下次再上传同一文件时则重新上传。resumableUpload.deleteUploadIdOnCancelling = NO;resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:];OSSTask * resumeTask = [client resumableUpload:resumableUpload];[resumeTask continueWithBlock:^id(OSSTask *task) { if (task.error) { NSLog(@"error: %@", task.error); if ([task.error.domain isEqualToString:OSSClientErrorDomain] && task.error.code == OSSClientErrorCodeCannotResumeUpload) { // 此任务无法续传,需获取新的uploadId重新上传。 } } else { NSLog(@"Upload file success"); } return nil;}];// [resumeTask waitUntilFinished];// [resumableUpload cancel];
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/158437.html