Complete Multipart Upload

2022-09-14 10:06:56

Complete Multipart Upload 完成分片上传

在将所有数据Part都上传完成后,必须调用Complete Multipart Upload API 来完成整个文件的Multipart Upload。在执行该操作时,用户必须提供所有有效的数据Part的列表(包括part号码和ETAG);棱束链对象储存 收到用户提交的Part列表后,会逐一验证每个数据Part的有效性。当所有的数据Part验证通过后,棱束链对象储存 将把这些数据part组合成一个完整的Object。

请求语法

POST /bucket-name/multi-part-obj?uploadId=UploadId HTTP/1.1
Host: s3-us-east-1.ossfiles.com
Content-Length:ContentLength
Date: GMT Date
Authorization: SignatureValue

<CompleteMultipartUpload>
  <Part>
    <PartNumber>PartNumber</PartNumber>
    <ETag>ETag</ETag>
  </Part>
  ...
</CompleteMultipartUpload>

请求元素(Request Elements)

名称 描述
CompleteMultipartUpload 保存 Complete Multipart Upload 请求内容的容器。 类型:容器 子节点:一个或多个 Part 元素 父节点:无
Part 保存已经上传 Part 信息的容器。 类型:容器 子节点:ETag, PartNumber 父节点:CompleteMultipartUpload
PartNumber Part 数目。 类型:整数 父节点:Part
ETag Part 成功上传后,棱束链对象储存 返回的 ETag值。 类型:字符串 父节点:Part

响应元素(Response Elements)

名称 描述
CompleteMultipartUploadResult 保存 Complete Multipart Upload 请求结果的容器。 类型:容器 子节点:Bucket, Key, ETag, Location 父节点:None
Location 新创建 Object 的 URL。 类型:字符串 父节点:CompleteMultipartUploadResult
Bucket Bucket 名称。 类型:字符串 父节点:CompleteMultipartUploadResult
Key 新创建 Object 的名字。 类型:字符串 父节点:CompleteMultipartUploadResult
ETag ETag (entity tag) 在每个 Object 生成的时候被创建,用于标示一个 Object 的内容。Complete Multipart Upload 请求创建的 Object,ETag 值是其内容的 UUID。ETag 值可以用于检查 Object 内容是否发生变化。 类型:字符串 父节点:CompleteMultipartUploadResult

细节分析

  1. 棱束链对象储存 处理 Complete Multipart Upload 请求时,该 upload 必须是上传状态,不能为完成或者终止状态,否则返回错。处理成功后,该 Upload 状态变为完成,Upload ID 变为无效。
  2. Complete Multipart Upload 时,会确认除最后一块以外所有块的大小都大于 5MB, 如果小于 5MB 返回错误,并检查用户提交的 PartList 中的每一个 Part 号码和 Etag。所以在上传 Part 时,客户端除了需要记录 Part 号码外,还需要记录每次上传 Part 成功后,服务器返回的 ETag 值。如果 part 号码不规范,返回错误。
  3. 用户提交的 Part List 中,Part 号码需要保持连续的。例如第一块的 Part 号码是1,第二块的 Part 号码是2,否则返回错误。
  4. 用户提交的 Part List 中的 Part 数量需要与已上传的 Part 数量一致,否则返回错误。
  5. 同一个 Object 可以同时拥有不同的 Upload Id,当 Complete 一个 Upload ID 后,该 Object 的其他 Upload ID 不受影响。

示例

请求示例:

POST /test212/1.vmdk?uploadId=323db2d29e0be022e1e21d1b7c91594c HTTP/1.1
Authorization: AWS4-HMAC-SHA256 Credential=6a19c6de088ff32ff663287eec8f3b85/20220420/us-east-1/s3/aws4_request,SignedHeaders=content-md5;host;user-agent;x-amz-content-sha256;x-amz-date, Signature=678c259c806259932756359c8c08e2a6cddd7e0d9851705dd2c7b22b8c6c1082
x-amz-content-sha256: 34e2c5aedea9193c845f7622ac738697139d906a8a28c3902d664693da6a5d7d
x-amz-date: 20220420T095029Z
Host: s3-us-east-1.ossfiles.com
Content-Length: 102

<?xml version="1.0"?>
<CompleteMultipartUpload>
    <Part>
        <PartNumber>1</PartNumber>
        <ETag>"dedd1949db7b094250ef80191b52d7de"</ETag>
    </Part>
    <Part>
        <PartNumber>2</PartNumber>
        <ETag>"d640e8ca7f736e1f4037283c1296076c"</ETag>
    </Part>
</CompleteMultipartUpload>

返回示例:


HTTP/1.1 200 OK
Date: Wed, 20 Apr 2022 09:50:27 GMT
Content-Type: application/xml
Content-Length: 331
Connection: keep-alive
Expires: Sat, 03 Mar 1990 23:33:33 GMT

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<CompleteMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Location>https://s3-us-east-1.ossfiles.com/test212/1.vmdk</Location>
    <Bucket>test212</Bucket>
    <Key>1.vmdk</Key>
    <ETag>"9427628e4e1bd8987846b1fdf3eee85f-26"</ETag>
</CompleteMultipartUploadResult>