问题描述
在使用阿里云对象存储OSS的iOS SDK通过断点续传上传功能上传文件时,上传文件失败,或者在断点续传时重新开始上传文件,并没有从断点记录处继续上传。
解决方案
使用阿里云对象存储OSS的iOS SDK通过断点续传上传功能上传文件出现异常,主要包括上传文件失败和无法实现续传两种情况,具体排查方法如下:
上传文件失败
iOS SDK通过断点续传上传功能上传文件失败的具体排查方法如下:
使用OSS的iOS SDK断点续传上传功能上传文件时,报
Access denied by authorizer's policy
错误,报错原因是搭建的STS服务器中Policy设置存在问题,通过STS的授权访问被拒绝。更多信息,请参见使用STS临时访问凭证访问OSS。断点续传失败,根据提供的集成日志,查看使用老版本的断点续传,老版本的断点续传集成分片上传,需要记录上传的分片ID和UploadIP,实现比较麻烦,推荐使用新版本的iOS SDK。目前该SDK分装好了分片上传,增加了设置断点记录的保存文件夹。如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,将从断点记录处继续上传,提供以下测试的代码,设置缓存的目录文件。断点续传上传的示例代码,请参见断点续传上传。
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; resumableUpload.recordDirectoryPath = cachesDir;
无法实现续传
断电续传时重新开始上传文件,并没有从断点记录处继续上传文件的排查方法如下:
如果通过断点续传上传功能上传文件可以成功,但上传过程中终止上传后,再重新上传,发现每次都是重新进行上传,测试断点续传上传并没有成功。搭建环境进行测试,获取到缓存文件中记录的断点文件信息,发现为空,也就是每次断点后都是没有生成断点信息,查看打印的日志,发现再次重传和上传断点处使用的UploadId不一致,设置如下所示。
NSString* content = [NSString stringWithContentsOfFile:thepath encoding:NSUTF8StringEncoding error:nil]; NSLog(@"读取内容:\n%@",content);
发现没有打开本地持久保存断点记录的调用方式,导致每次生成的断点记录在中断传输后都会自动的清除,请增加如下信息的设置,保留断点记录。
resumableUpload.deleteUploadIdOnCancelling = NO
说明将参数
deleteUploadIdOnCancelling
设置为NO,表示不删除断点记录文件,上传失败后将从断点记录处继续上传直到文件上传完成。如果不设置此参数,即保留默认值YES,表示删除断点记录文件,下次再上传同一文件时则重新上传。