iOS断点续上传

作者: 斑驳的流年无法释怀 | 来源:发表于2017-04-28 10:24 被阅读109次

该功能将单个文件分割成数个固定大小的块并发上传,可以在实现断点续传的同时加快上传速度(并发上传)。

一、术语

  1. 上传服务器(Up-Server):提供断点续上传功能的服务器,负责启动新的上传过程、接受上传内容、合并生成最终上传文件。

  2. 业务服务器(Biz-Server):七牛云存储的客户的业务服务器,负责上传操作鉴权、分配操作策略、生成UpToken、驱动上传端启动上传。

  3. 上传授权凭证(UpToken):由业务服务器使用AccessKey和SecretKey,对操作策略进行数字签名防伪而生成的上传凭证。参考:生成上传授权凭证

  4. 操作策略(Policy):由业务服务器填写、由上传服务器执行的操作信息。参考:生成上传授权凭证 4.1. 操作域(Scope):1)空,表示可以上传到任意Bucket(仅限于新增文件);2) “Bucket”,表示限定只能传到该Bucket(仅限于新增文件);3) “Bucket:Key”,表示限定特定的文档,可新增或修改文件; 4.2. 超时时限(DeadLine):上传授权凭证的有效时间,单位是秒; 4.3. 回调URL(CallbackURL):如果指定,在合并文件后,由上传服务器调用此URL,以通知业务服务器做相应处理; 4.4. 返回URL(ReturnURL):如果指定,在合并文件后,由上传服务器重定向到此URL,以通知客户端继续表单处理流程。

  5. 上传端(Up-Client):七牛云存储的客户的业务终端,负责提出、实施上传。

  6. 分割块(Block):分割块是以指定大小(一般为4MB)为单位分割待传文件得到的内容块。最后一个分割块可以小于4MB。不同分割块可以乱序并行上传。所有分割块上传完毕后由服务器进行内容排序合并。

  7. 上传块(Chunk):上传块是对分割块的进一步切分,可以由用户自行设定大小,以适应不同网络环境的限制。上传块必须顺序上传,同时根据需求保存上传过程中的上下文信息、同一分割块已传部分的校验值,以便在断点续传时恢复操作环境。

  8. 上下文信息(Context):服务器成功保存上传块后返回的操作环境信息,可保存在上传端本地,以便恢复操作环境。上传开始后,每个分割块都有自己的上下文信息。上传端不能修改接收到的上下文信息。

  9. 校验值(CheckSum):服务器成功保存上传块后返回的、当前分割块的已传部分的校验值,可保存在上传端本地,用于最后合并文件。上传开始后,每个分割块都有自己的校验值。上传端不能修改接收到的校验值。

操作顺序图示@2x.png

二、流程

  1. 请求断点续上传(Request Upload):由上传端发起,向业务服务器申请执行断点续上传;

  2. 生成操作策略/上传凭证(Make Policy/UpToken):业务服务器对上传端进行鉴权/签名上传凭证/授权;

  3. 分割文件(Split File):上传端获得授权后,以指定块大小(一般为4MB)为单位,将待传文件分割为数个分割块;

  4. 上传分割块(Upload Blocks):上传端将单个分割块至上传服务器(可以并发上传不同的分割块,加快上传速度)。每个分割块的上传过程必须顺序完成(串行上传每个上传块)。上传服务器会针对接受到的上传块,返回对应分割块的已上传部分的上下文信息和校验码;

  5. 合并文件(Make File):所有分割块均成功上传完毕后,由上传端通知上传服务器将其合并成原上传对象文件;

  6. 若指定CallbackURL,上传服务器在合并文件后会调用此URL,通知业务服务器做相应处理; 否则返回响应结果。

注:在第4步的任何节点均可终止(Abort)上传分割块,或在断点处根据上下文信息恢复上传分割块。

三、API

  1. 授权
    授权信息在 HTTP 头部表现如下:
    Authorization UpToken <UploadToken>
    授权操作需要在 HTTP Headers 中新增一个名为 Authorization 的字段,并传入 UploadToken 作为值。
    上述授权格式等价于:
    Authorization UpToken accessKey:authDigest:authInfoEncoded
    <UploadToken>
    的细节可以参考文档:生成上传授权凭证

  2. 创建分割块(Block)并上传第一个数据块(Chunk)
    HTTP/1.1 POST http://up.qbox.me/mkblk/<BlockSize> Content-Type: application/octet-stream Request Headers: { Authorization: UpToken <UploadToken> } Request Body: <First-Chunk-Binary> HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Response Body: { ctx: <BlockCtx string>, checksum: <BlockChecksum string>, crc32: <ChunkCrc32 int>, host: <SelectedUpHost string> // 后续的 bput, rs-mkfile 等请求要求发到此 host }

  3. 上传分割块(Block)中的数据块(Chunk)
    HTTP/1.1 POST <SelectedUpHost>/bput/<BlockCtx>/<Offset> Content-Type: application/octet-stream Request Headers: { Authorization: UpToken <UploadToken> } Request Body: <Next-Chunk-Binary> HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Response Body: { ctx: <BlockCtx string>, checksum: <BlockChecksum string>, crc32: <ChunkCrc32 int>, host: <SelectedUpHost string> }

  4. 合并文件
    HTTP/1.1 POST <SelectedUpHost>/rs-mkfile/<EncodedEntryURI>/fsize/<Fsize> \ /mimeType/<EncodedMimeType> \ /meta/<EncodedCustomMeta> \ /customer/<CustomerId> \ /params/<EncodedCallbackParams> \ /rotate/<Rotate> Content-Type: text/plain Request Headers: { Authorization: UpToken <UploadToken> } Request Body: <Ctx-Array> // 以 “,” 分隔的 ctx string 列表,注意 Content-Type: text/plain HTTP/1.1 200 OK Content-Type: application/json Cache-Control: no-store Response Body: { hash: <FileEtag string> }
    注意:同一存储空间(Bucket)下,已存在与当前上传条目名称相同的条目时,若当前上传文件内容与原有文件内容一致,则返回成功响应;若文件内容不一致,则上传失败,并返回失败响应。
    Fsize
    文件大小,单位 Byte,必须项。
    表明文件的 MIME 类型,缺省情况下为 application/octet-stream
    ,可选项。
    文件备注信息,可选项,一般不传入。

  5. 样例
    样例程序:
    C/C++ - https://github.com/qiniu/c-sdk/blob/master/qbox/up.c
    Java - https://github.com/qiniu/java-sdk/blob/master/src/main/java/com/qiniu/qbox/up/UpService.java
    Perl - https://github.com/qiniu/perl-sdk/blob/master/lib/QBox/UP.pm
    Ruby - https://github.com/qiniu/ruby-sdk/blob/master/lib/qiniu/rs/up.rb

参考资料:
C/C++ SDK 使用指南——断点续上传
七牛云存储

相关文章

  • iOS断点续上传

    该功能将单个文件分割成数个固定大小的块并发上传,可以在实现断点续传的同时加快上传速度(并发上传)。 一、术语 上传...

  • iOS将文件切片储存并上传仿断点续传机制

    iOS将文件切片储存并上传仿断点续传机制 iOS将文件切片储存并上传仿断点续传机制

  • iOS开发!知识点!汇总

    一.断点续传相关 1.iOS模仿断点机制上传文件实现方法 2.iOS多任务断点续传之"框架"封装 二.有关硬件支持...

  • iOS 视频断点上传

    -查询1.加密字符串(具体后台可以定义):首先和后端约定了需要传的参数(此处我用的是“md5value”)。每次上...

  • iOS断点续传-上传

    断点上传是将文件切割成小数据片段进行上传,并记录上传进度,当上传完毕后,服务端将上传的小文件片段进行合并的过程。采...

  • AFNetworking

    上传 单图片上传 多文件上传 下载 AFNetworking 断点下载

  • iOS 常用调试方法:断点

    级别: ★☆☆☆☆标签:「Xcode断点调试」「iOS breakpoint」「iOS全局断点」作者: Xs·H...

  • 断点上传

    一、断点上传辨义 在 Http 协议之下的 文件下载有“断点续传”功能,从服务器到客户端的文件下载可行,而对Htt...

  • NSURLSession的下载和断点继传和后台下载

    一.概述 NSURLSession始于ios7.它具有访问接口,上传/下载数据,断点继传和后台下载等功能:其使用步...

  • 实战:1分钟搞懂OkHttp断点上传

    1、前言 经常会有同学问:文件的断点上传如何实现? 断点上传/下载,这是在客户端经常遇到的场景,当我们需要上传或下...

网友评论

    本文标题:iOS断点续上传

    本文链接:https://www.haomeiwen.com/subject/fajozttx.html