使用OSS的iOS SDK通过断点续传上传文件异常的排查方法

问题描述

在使用阿里云对象存储OSSiOS SDK通过断点续传上传功能上传文件时,上传文件失败,或者在断点续传时重新开始上传文件,并没有从断点记录处继续上传。

解决方案

使用阿里云对象存储OSSiOS SDK通过断点续传上传功能上传文件出现异常,主要包括上传文件失败和无法实现续传两种情况,具体排查方法如下:

上传文件失败

iOS SDK通过断点续传上传功能上传文件失败的具体排查方法如下:

  1. 使用OSSiOS SDK断点续传上传功能上传文件时,报Access denied by authorizer's policy错误,报错原因是搭建的STS服务器中Policy设置存在问题,通过STS的授权访问被拒绝。更多信息,请参见使用STS临时访问凭证访问OSS

  2. 断点续传失败,根据提供的集成日志,查看使用老版本的断点续传,老版本的断点续传集成分片上传,需要记录上传的分片IDUploadIP,实现比较麻烦,推荐使用新版本的iOS SDK。目前该SDK分装好了分片上传,增加了设置断点记录的保存文件夹。如果任务失败,在下次重新启动任务,上传同一文件到同一Bucket、Object时,将从断点记录处继续上传,提供以下测试的代码,设置缓存的目录文件。断点续传上传的示例代码,请参见断点续传上传

    NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    resumableUpload.recordDirectoryPath = cachesDir;

无法实现续传

断电续传时重新开始上传文件,并没有从断点记录处继续上传文件的排查方法如下:

  1. 如果通过断点续传上传功能上传文件可以成功,但上传过程中终止上传后,再重新上传,发现每次都是重新进行上传,测试断点续传上传并没有成功。搭建环境进行测试,获取到缓存文件中记录的断点文件信息,发现为空,也就是每次断点后都是没有生成断点信息,查看打印的日志,发现再次重传和上传断点处使用的UploadId不一致,设置如下所示。

    NSString* content = [NSString stringWithContentsOfFile:thepath encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"读取内容:\n%@",content);

  2. 发现没有打开本地持久保存断点记录的调用方式,导致每次生成的断点记录在中断传输后都会自动的清除,请增加如下信息的设置,保留断点记录。

    resumableUpload.deleteUploadIdOnCancelling = NO
    说明

    将参数deleteUploadIdOnCancelling设置为NO,表示不删除断点记录文件,上传失败后将从断点记录处继续上传直到文件上传完成。如果不设置此参数,即保留默认值YES,表示删除断点记录文件,下次再上传同一文件时则重新上传。