最近需要使用七牛的图片存储。并且需要利用上它的断点续传。花了一天的时间看了一下。总结一下注意点:
七牛的sdk提供的已近非常不错了。核心的上传其实就是2个方法:
//@"myqiniutest"
[_upManager putFile:fileUrl.path key:nil token:uptoken complete: ^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
NSLog(@"看看-------%@",info);
NSLog(@"看看-------%@",resp);
// [self sysData:resp andSynData:synData ];
} option:opt];
//@"myqiniutest"
[_upManager putData:fileUrl.path key:nil token:uptoken complete: ^(QNResponseInfo *info, NSString *key, NSDictionary *resp) {
NSLog(@"看看-------%@",info);
NSLog(@"看看-------%@",resp);
// [self sysData:resp andSynData:synData ];
} option:opt];
第一个是使用的文件地址传输。第二个是直接传nsdata;参数:
putFile & putData 上传的文件地址 或者文件的二进制
key 文件的key 可以理解为文件名。需要注意的是:如果制定文件名,那么在生成token的时候就需要带上这个参数生成!!如果要实现断点续传。应该是必须要的。
token 这个应该不要解释了。七牛的token 最好放在后台生成。
complete 完成后回调。调用七牛的暂停传输 也会 回调这个方法。
option 各种参数的字典。简单使用七牛可以忽略这个参数。传nil就ok了。 要灵活使用七牛。就是用这个参数了。
QNUploadOption *opt = [[QNUploadOption alloc] initWithMime:nil progressHandler: ^(NSString *key, float percent) {
NSLog(@"percent %f", percent);
} params:nil checkCrc:NO cancellationSignal: ^BOOL () {
return self.uploadMode.uploatType == UPLOAD_STATUS_NO;
}];
就是这个对象了。 我主要就是需要使用那2个回调方法。
progressHandler :上传进度的回调方法。回调的2各参数 一个是 上面的那个key 就是你传过去的key。 还有一个就是百分比了。
cancellationSignal :将这个方法返回 yes 七牛就会自动停止上传了。 这里需要注意。七牛是在每次上传完一个片之后才会调用这个方法。换句话说。如果你在一个片上传过程中想暂停是行不通的。只能等上传完一个片之后会暂停。
---------------------
下面记录一下啊我像断点续传以及暂停功能犯下的错误。
1.无论断点续传 还是暂停 应该都是需要使用文件传输。不能使用nsdata传输。使用nsdata 就不切片了。
2.断点上传前 七牛会比较一下文件的修改时间。如果不相等。就从0开始上传了。
需要使用断点续传的功能。就需要在创建 QNUploadManager 的时候 。传入一个 id <QNRecorderDelegate> 的代理。负责保存暂停的时候的数据。
其实就是保存几个 key 对应的value 。并且在续传的时候 能够取到:七牛自带的实现 是存入了这样的json:
{
"modify_time": 1430804968,
"size": 1242273,
"contexts": [
"kXrov73dBdTt9OAC3K_iHQEEDi13WX7bE6njV3MUdKjCEq-HbBOqBI-B7c7d227R8o7tmsXV9Xhgtw0b_KxxjOTn3qGW3YuarqrRFFicoh6gGvPdQ1uBtyIwcA4IFV9W1ZHi8sy_OVwoFcBPEwAAAAAAAAgAAAAAAKH0EgAAAAgAUnhZQUFKV3lTRlVvT3hNQQ=="
],
"offset": 524288
}
很同意理解 :
modify_time 文件的修改时间。用来判断是否需要从0开始的。
size 文件总大小。
offset 偏移量。 就是从哪里开始。
contexts 应该是 七牛自己的加密。验证的东西。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
需要记录的就上面这些了。下面 稍微写下 七牛对于 断点续传的 实现过程:
1.读取文件属性。 出错调用 完成block 参数是错误的信息
2.如果文件大小 小于 kQNPutThreshold (默认是 512k) 就直接上传 不切片了。
3.如果_recorder和_recorderKeyGen都不为空 去对应的地方获取key。(这里应该是 不用它原本提供的路径。原本提供的路径直接是 key为文件名)
4.执行上传。
4.1 根据上面记录的信息去验证偏移量。只要 出现不合理的情况 都直接返回0.即从0开始上传。
这些情况主要有_recorder 或者 key 为空。存储的内容为空。 或者 取出来的 json里面有一个值为空。偏移量大于了size。记录的size不等于当前的size。文件的修改时间不一致。
4.2 调用取消的回调block 如果返回yes 调用结束block 退出上传。
4.3 如果偏移量和文件大小一样。判断状态是否ok(估计是七牛返回的数据 估计没有深入去看)如果是ok的就移除这个上传记录(断点续传的记录)。并且将进度设置成100%。如果不是ok的但是还在重试允许次数范围之内。那么就从新试一次。试的计数+1. 返回。 最后调用 完成block (这个是七牛的block 里面处理了很多的情况 )。
4.4 最后给后台发出合并的信号。让后台将切片文件组装起来吧。然后调用我们的 完成 block