該功能將單個(gè)文件分割成數(shù)個(gè)固定大小的塊并發(fā)上傳,可以在實(shí)現(xiàn)斷點(diǎn)續(xù)傳的同時(shí)加快上傳速度(并發(fā)上傳)。
一、術(shù)語
上傳服務(wù)器(Up-Server):提供斷點(diǎn)續(xù)上傳功能的服務(wù)器,負(fù)責(zé)啟動(dòng)新的上傳過程、接受上傳內(nèi)容、合并生成最終上傳文件。
業(yè)務(wù)服務(wù)器(Biz-Server):七牛云存儲(chǔ)的客戶的業(yè)務(wù)服務(wù)器,負(fù)責(zé)上傳操作鑒權(quán)、分配操作策略、生成UpToken、驅(qū)動(dòng)上傳端啟動(dòng)上傳。
上傳授權(quán)憑證(UpToken):由業(yè)務(wù)服務(wù)器使用AccessKey和SecretKey,對(duì)操作策略進(jìn)行數(shù)字簽名防偽而生成的上傳憑證。參考:生成上傳授權(quán)憑證
操作策略(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ù)表單處理流程。
上傳端(Up-Client):七牛云存儲(chǔ)的客戶的業(yè)務(wù)終端,負(fù)責(zé)提出、實(shí)施上傳。
分割塊(Block):分割塊是以指定大小(一般為4MB)為單位分割待傳文件得到的內(nèi)容塊。最后一個(gè)分割塊可以小于4MB。不同分割塊可以亂序并行上傳。所有分割塊上傳完畢后由服務(wù)器進(jìn)行內(nèi)容排序合并。
上傳塊(Chunk):上傳塊是對(duì)分割塊的進(jìn)一步切分,可以由用戶自行設(shè)定大小,以適應(yīng)不同網(wǎng)絡(luò)環(huán)境的限制。上傳塊必須順序上傳,同時(shí)根據(jù)需求保存上傳過程中的上下文信息、同一分割塊已傳部分的校驗(yàn)值,以便在斷點(diǎn)續(xù)傳時(shí)恢復(fù)操作環(huán)境。
上下文信息(Context):服務(wù)器成功保存上傳塊后返回的操作環(huán)境信息,可保存在上傳端本地,以便恢復(fù)操作環(huán)境。上傳開始后,每個(gè)分割塊都有自己的上下文信息。上傳端不能修改接收到的上下文信息。
校驗(yàn)值(CheckSum):服務(wù)器成功保存上傳塊后返回的、當(dāng)前分割塊的已傳部分的校驗(yàn)值,可保存在上傳端本地,用于最后合并文件。上傳開始后,每個(gè)分割塊都有自己的校驗(yàn)值。上傳端不能修改接收到的校驗(yàn)值。
二、流程
請(qǐng)求斷點(diǎn)續(xù)上傳(Request Upload):由上傳端發(fā)起,向業(yè)務(wù)服務(wù)器申請(qǐng)執(zhí)行斷點(diǎn)續(xù)上傳;
生成操作策略/上傳憑證(Make Policy/UpToken):業(yè)務(wù)服務(wù)器對(duì)上傳端進(jìn)行鑒權(quán)/簽名上傳憑證/授權(quán);
分割文件(Split File):上傳端獲得授權(quán)后,以指定塊大小(一般為4MB)為單位,將待傳文件分割為數(shù)個(gè)分割塊;
上傳分割塊(Upload Blocks):上傳端將單個(gè)分割塊至上傳服務(wù)器(可以并發(fā)上傳不同的分割塊,加快上傳速度)。每個(gè)分割塊的上傳過程必須順序完成(串行上傳每個(gè)上傳塊)。上傳服務(wù)器會(huì)針對(duì)接受到的上傳塊,返回對(duì)應(yīng)分割塊的已上傳部分的上下文信息和校驗(yàn)碼;
合并文件(Make File):所有分割塊均成功上傳完畢后,由上傳端通知上傳服務(wù)器將其合并成原上傳對(duì)象文件;
若指定CallbackURL,上傳服務(wù)器在合并文件后會(huì)調(diào)用此URL,通知業(yè)務(wù)服務(wù)器做相應(yīng)處理; 否則返回響應(yīng)結(jié)果。
注:在第4步的任何節(jié)點(diǎn)均可終止(Abort)上傳分割塊,或在斷點(diǎn)處根據(jù)上下文信息恢復(fù)上傳分割塊。
三、API
授權(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)憑證創(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 }上傳分割塊(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> }合并文件
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),一般不傳入。樣例
樣例程序:
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