iOS斷點(diǎn)續(xù)上傳

該功能將單個(gè)文件分割成數(shù)個(gè)固定大小的塊并發(fā)上傳,可以在實(shí)現(xiàn)斷點(diǎn)續(xù)傳的同時(shí)加快上傳速度(并發(fā)上傳)气堕。

一、術(shù)語

  1. 上傳服務(wù)器(Up-Server):提供斷點(diǎn)續(xù)上傳功能的服務(wù)器,負(fù)責(zé)啟動(dòng)新的上傳過程范嘱、接受上傳內(nèi)容送膳、合并生成最終上傳文件。

  2. 業(yè)務(wù)服務(wù)器(Biz-Server):七牛云存儲(chǔ)的客戶的業(yè)務(wù)服務(wù)器丑蛤,負(fù)責(zé)上傳操作鑒權(quán)叠聋、分配操作策略、生成UpToken受裹、驅(qū)動(dòng)上傳端啟動(dòng)上傳碌补。

  3. 上傳授權(quán)憑證(UpToken):由業(yè)務(wù)服務(wù)器使用AccessKey和SecretKey,對(duì)操作策略進(jìn)行數(shù)字簽名防偽而生成的上傳憑證棉饶。參考:生成上傳授權(quán)憑證

  4. 操作策略(Policy):由業(yè)務(wù)服務(wù)器填寫厦章、由上傳服務(wù)器執(zhí)行的操作信息。參考:生成上傳授權(quán)憑證 4.1. 操作域(Scope):1)空照藻,表示可以上傳到任意Bucket(僅限于新增文件)袜啃;2) “Bucket”,表示限定只能傳到該Bucket(僅限于新增文件)幸缕;3) “Bucket:Key”群发,表示限定特定的文檔,可新增或修改文件; 4.2. 超時(shí)時(shí)限(DeadLine):上傳授權(quán)憑證的有效時(shí)間发乔,單位是秒; 4.3. 回調(diào)URL(CallbackURL):如果指定熟妓,在合并文件后,由上傳服務(wù)器調(diào)用此URL栏尚,以通知業(yè)務(wù)服務(wù)器做相應(yīng)處理; 4.4. 返回URL(ReturnURL):如果指定滑蚯,在合并文件后,由上傳服務(wù)器重定向到此URL抵栈,以通知客戶端繼續(xù)表單處理流程告材。

  5. 上傳端(Up-Client):七牛云存儲(chǔ)的客戶的業(yè)務(wù)終端,負(fù)責(zé)提出古劲、實(shí)施上傳斥赋。

  6. 分割塊(Block):分割塊是以指定大小(一般為4MB)為單位分割待傳文件得到的內(nèi)容塊产艾。最后一個(gè)分割塊可以小于4MB疤剑。不同分割塊可以亂序并行上傳。所有分割塊上傳完畢后由服務(wù)器進(jìn)行內(nèi)容排序合并闷堡。

  7. 上傳塊(Chunk):上傳塊是對(duì)分割塊的進(jìn)一步切分隘膘,可以由用戶自行設(shè)定大小,以適應(yīng)不同網(wǎng)絡(luò)環(huán)境的限制杠览。上傳塊必須順序上傳弯菊,同時(shí)根據(jù)需求保存上傳過程中的上下文信息、同一分割塊已傳部分的校驗(yàn)值踱阿,以便在斷點(diǎn)續(xù)傳時(shí)恢復(fù)操作環(huán)境管钳。

  8. 上下文信息(Context):服務(wù)器成功保存上傳塊后返回的操作環(huán)境信息钦铁,可保存在上傳端本地,以便恢復(fù)操作環(huán)境才漆。上傳開始后牛曹,每個(gè)分割塊都有自己的上下文信息。上傳端不能修改接收到的上下文信息醇滥。

  9. 校驗(yàn)值(CheckSum):服務(wù)器成功保存上傳塊后返回的黎比、當(dāng)前分割塊的已傳部分的校驗(yàn)值,可保存在上傳端本地鸳玩,用于最后合并文件阅虫。上傳開始后,每個(gè)分割塊都有自己的校驗(yàn)值怀喉。上傳端不能修改接收到的校驗(yàn)值书妻。

操作順序圖示@2x.png

二、流程

  1. 請(qǐng)求斷點(diǎn)續(xù)上傳(Request Upload):由上傳端發(fā)起躬拢,向業(yè)務(wù)服務(wù)器申請(qǐng)執(zhí)行斷點(diǎn)續(xù)上傳;

  2. 生成操作策略/上傳憑證(Make Policy/UpToken):業(yè)務(wù)服務(wù)器對(duì)上傳端進(jìn)行鑒權(quán)/簽名上傳憑證/授權(quán);

  3. 分割文件(Split File):上傳端獲得授權(quán)后躲履,以指定塊大小(一般為4MB)為單位聊闯,將待傳文件分割為數(shù)個(gè)分割塊;

  4. 上傳分割塊(Upload Blocks):上傳端將單個(gè)分割塊至上傳服務(wù)器(可以并發(fā)上傳不同的分割塊工猜,加快上傳速度)。每個(gè)分割塊的上傳過程必須順序完成(串行上傳每個(gè)上傳塊)菱蔬。上傳服務(wù)器會(huì)針對(duì)接受到的上傳塊篷帅,返回對(duì)應(yīng)分割塊的已上傳部分的上下文信息和校驗(yàn)碼;

  5. 合并文件(Make File):所有分割塊均成功上傳完畢后,由上傳端通知上傳服務(wù)器將其合并成原上傳對(duì)象文件;

  6. 若指定CallbackURL拴泌,上傳服務(wù)器在合并文件后會(huì)調(diào)用此URL魏身,通知業(yè)務(wù)服務(wù)器做相應(yīng)處理; 否則返回響應(yīng)結(jié)果。

注:在第4步的任何節(jié)點(diǎn)均可終止(Abort)上傳分割塊蚪腐,或在斷點(diǎn)處根據(jù)上下文信息恢復(fù)上傳分割塊箭昵。

三、API

  1. 授權(quán)
    授權(quán)信息在 HTTP 頭部表現(xiàn)如下:
    Authorization UpToken <UploadToken>
    授權(quán)操作需要在 HTTP Headers 中新增一個(gè)名為 Authorization 的字段回季,并傳入 UploadToken 作為值家制。
    上述授權(quán)格式等價(jià)于:
    Authorization UpToken accessKey:authDigest:authInfoEncoded
    <UploadToken>
    的細(xì)節(jié)可以參考文檔:生成上傳授權(quán)憑證

  2. 創(chuàng)建分割塊(Block)并上傳第一個(gè)數(shù)據(jù)塊(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> // 后續(xù)的 bput, rs-mkfile 等請(qǐng)求要求發(fā)到此 host }

  3. 上傳分割塊(Block)中的數(shù)據(jù)塊(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> }
    注意:同一存儲(chǔ)空間(Bucket)下泡一,已存在與當(dāng)前上傳條目名稱相同的條目時(shí)颤殴,若當(dāng)前上傳文件內(nèi)容與原有文件內(nèi)容一致,則返回成功響應(yīng)鼻忠;若文件內(nèi)容不一致涵但,則上傳失敗,并返回失敗響應(yīng)。
    Fsize
    文件大小贤笆,單位 Byte蝇棉,必須項(xiàng)讨阻。
    表明文件的 MIME 類型芥永,缺省情況下為 application/octet-stream
    ,可選項(xiàng)钝吮。
    文件備注信息埋涧,可選項(xiàng),一般不傳入奇瘦。

  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 使用指南——斷點(diǎn)續(xù)上傳
七牛云存儲(chǔ)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棘催,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耳标,更是在濱河造成了極大的恐慌醇坝,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件次坡,死亡現(xiàn)場離奇詭異呼猪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砸琅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門宋距,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人症脂,你說我怎么就攤上這事谚赎。” “怎么了诱篷?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵壶唤,是天一觀的道長。 經(jīng)常有香客問我棕所,道長闸盔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任橙凳,我火速辦了婚禮蕾殴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岛啸。我一直安慰自己钓觉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布坚踩。 她就那樣靜靜地躺著荡灾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上批幌,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天础锐,我揣著相機(jī)與錄音,去河邊找鬼荧缘。 笑死皆警,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的截粗。 我是一名探鬼主播信姓,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绸罗!你這毒婦竟也來了意推?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤珊蟀,失蹤者是張志新(化名)和其女友劉穎菊值,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體育灸,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腻窒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了描扯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定页。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绽诚,靈堂內(nèi)的尸體忽然破棺而出典徊,到底是詐尸還是另有隱情,我是刑警寧澤恩够,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布卒落,位于F島的核電站,受9級(jí)特大地震影響蜂桶,放射性物質(zhì)發(fā)生泄漏儡毕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一扑媚、第九天 我趴在偏房一處隱蔽的房頂上張望腰湾。 院中可真熱鬧,春花似錦疆股、人聲如沸费坊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽附井。三九已至讨越,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間永毅,已是汗流浹背把跨。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沼死,地道東北人着逐。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像漫雕,于是被迫代替她去往敵國和親滨嘱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峰鄙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理浸间,服務(wù)發(fā)現(xiàn),斷路器吟榴,智...
    卡卡羅2017閱讀 134,696評(píng)論 18 139
  • 一魁蒜、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,373評(píng)論 6 152
  • Http協(xié)議詳解 標(biāo)簽(空格分隔): Linux 聲明:本片文章非原創(chuàng),內(nèi)容來源于博客園作者M(jìn)IN飛翔的HTTP協(xié)...
    Sivin閱讀 5,226評(píng)論 3 82
  • 工作流程 一次HTTP操作稱為一個(gè)事務(wù)吩翻,其工作過程可分為四步: 1)首先客戶機(jī)與服務(wù)器需要建立連接兜看。只要單擊某個(gè)超...
    保川閱讀 4,617評(píng)論 2 14
  • 小時(shí)候熊锭,我們聽過最大的謊言是什么弧轧?“壓歲錢媽媽給你保管,長大了還給你”碗殷。 很多父母都有這樣的疑惑:該給孩子多少零花...
    c1d1fc6882f8閱讀 586評(píng)論 0 4