七牛断点续传-ios

最近需要使用七牛的图片存储。并且需要利用上它的断点续传。花了一天的时间看了一下。总结一下注意点:

七牛的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




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值