在將所有數據Part都上傳完成後,必須調用Complete Multipart Upload API來完成整個檔案的Multipart Upload。
在執行該操作時,用戶必須提供所有有效數據Part的列表(包括part號碼和ETAG)。OSS收到用戶提交的Part列表後,會逐一驗證每個數據Part的有效性。當所有的數據Part驗證通過後,OSS將把這些數據part組合成一個完整的Object。
請求文法
POST /ObjectName?uploadId=UploadId HTTP/1.1
Host: BucketName.oss-cn-hangzhou.aliyuncs.com
Date: GMT Date
Content-Length: Size
Authorization: Signature
<CompleteMultipartUpload>
<Part>
<PartNumber>PartNumber</PartNumber>
<ETag>ETag</ETag>
</Part>
...
</CompleteMultipartUpload>
請求參數(Request Parameters)
Complete Multipart Upload時,可以通過encoding-type對返回結果中的Key進行編碼。
名稱 | 類型 | 描述 |
---|---|---|
encoding-type | 字元串 | 指定對返回的Key進行編碼,目前支援url編碼。Key使用UTF-8字元,但xml 1.0標準不支援解析一些控制字元,比如ascii值從0到10的字元。對於Key中包含xml 1.0標準不支援的控制字元,可以通過指定encoding-type對返回的Key進行編碼。 預設值:無 可選值:url |
請求元素(Request Elements)
名稱 | 類型 | 描述 |
---|---|---|
CompleteMultipartUpload | 容器 | 保存保存Complete Multipart Upload請求內容的容器。 子節點:一個或多個Part元素 父節點:無 |
ETag | 字元串 | Part成功上傳後,OSS返回的ETag值。 父節點:Part |
Part | 容器 | 保存已經上傳Part資訊的容器。 子節點:ETag, PartNumber 父節點:InitiateMultipartUploadResult |
PartNumber | 整數 | Part數目。 父節點:Part |
響應元素(Response Elements)
名稱 | 類型 | 描述 |
---|---|---|
Bucket | 字元串 | Bucket名稱。 父節點:CompleteMultipartUploadResult |
CompleteMultipartUploadResult | 容器 | 保存Complete Multipart Upload請求結果的容器。 子節點:Bucket, Key, ETag, Location 父節點:None |
ETag | 字元串 | ETag (entity tag) 在每個Object生成的時候被建立,用於標示一個Object的內容。Complete Multipart Upload請求建立的Object,ETag值是其內容的UUID。ETag值可以用於檢查Object內容是否發生變化。 父節點:CompleteMultipartUploadResult |
Location | 字元串 | 新建立Object的URL。 父節點:CompleteMultipartUploadResult |
Key | 字元串 | 新建立Object的名字。 父節點:CompleteMultipartUploadResult |
EncodingType | 字元串 | 指明返回結果中編碼使用的類型。如果請求的參數中指定了encoding-type,那返回的結果會對Key進行編碼。 父節點:容器 |
細節分析
- Complete Multipart Upload時,會確認除最後一塊以外所有塊的大小都大於100KB,並檢查用戶提交的Partlist中的每一個Part號碼和Etag。所以在上傳Part時,客戶端除了需要記錄Part號碼外,還需要記錄每次上傳Part成功後,伺服器返回的ETag值。
- OSS處理Complete Multipart Upload請求時,會持續一定的時間。在這段時間內,如果客戶端和OSS之間的連結斷掉,OSS仍會繼續將請求做完。
- 用戶提交的Part List中,Part號碼可以是不連續的。例如第一塊的Part號碼是1,第二塊的Part號碼是5。
- OSS處理Complete Multipart Upload請求成功後,該Upload ID就會變成無效。
- 同一個Object可以同時擁有不同的Upload Id,當Complete一個Upload ID後,該Object的其他Upload ID不受影響。
- 若調用Initiate Multipart Upload介面時,指定了x-oss-server-side-encryption要求標頭,則在Complete Multipart Upload的回應標頭中返回x-oss-server-side-encryption,其值表明該Object的伺服器端密碼編譯演算法。
- 如果用戶上傳了Content-MD5要求標頭,OSS會計算body的Content-MD5並檢查一致性。如果不一致,將返回InvalidDigest錯誤碼。
樣本
請求樣本:
POST /multipart.data? uploadId=0004B9B2D2F7815C432C9057C03134D4 HTTP/1.1
Host: oss-example.oss-cn-hangzhou.aliyuncs.com
Content-Length: 1056
Date: Fri, 24 Feb 2012 10:19:18 GMT
Authorization: OSS qn6qrrqxo2oawuk53otfjbyc:8VwFhFUWmVecK6jQlHlXMK/zMT0=
<CompleteMultipartUpload>
<Part>
<PartNumber>1</PartNumber>
<ETag>"3349DC700140D7F86A078484278075A9"</ETag>
</Part>
<Part>
<PartNumber>5</PartNumber>
<ETag>"8EFDA8BE206636A695359836FE0A0E0A"</ETag>
</Part>
<Part>
<PartNumber>8</PartNumber>
<ETag>"8C315065167132444177411FDA149B92"</ETag>
</Part>
</CompleteMultipartUpload>
返回樣本:
HTTP/1.1 200 OK
Server: AliyunOSS
Content-Length: 329
Content-Type: Application/xml
Connection: keep-alive
x-oss-request-id: 594f0751-3b1e-168f-4501-4ac71d217d6e
Date: Fri, 24 Feb 2012 10:19:18 GMT
<?xml version="1.0" encoding="UTF-8"?>
<CompleteMultipartUploadResult xmlns=”http://doc.oss-cn-hangzhou.aliyuncs.com”>
<Location>http://oss-example.oss-cn-hangzhou.aliyuncs.com /multipart.data</Location>
<Bucket>oss-example</Bucket>
<Key>multipart.data</Key>
<ETag>B864DB6A936D376F9F8D3ED3BBE540DD-3</ETag>
</CompleteMultipartUploadResult>