在將所有數據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>