iOS断点续上传

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

一、术语

  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 使用指南——断点续上传
七牛云存储

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,662评论 18 139
  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 8,359评论 6 152
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 5,224评论 3 82
  • 工作流程 一次HTTP操作称为一个事务,其工作过程可分为四步: 1)首先客户机与服务器需要建立连接。只要单击某个超...
    保川阅读 4,608评论 2 14
  • 小时候,我们听过最大的谎言是什么?“压岁钱妈妈给你保管,长大了还给你”。 很多父母都有这样的疑惑:该给孩子多少零花...
    c1d1fc6882f8阅读 581评论 0 4