CompleteMultipartUpload 接口请求实现完成整个分块上传。当使用 UploadPart 和 UploadPartCopy 上传所有分块完成后,必须调用本接口来完成最终对象的合并。在请求体中需提供每一个分块的
PartNumber 和 ETag,用于校验分块的完整性与顺序。注意事项
分块顺序与完整性
请求体中的
<Part> 列表必须满足以下约束:每个
<Part> 的 PartNumber 必须对应一个本次分块上传中实际已上传的分块;任一 PartNumber 不存在、或 ETag 与服务端已记录的不一致,将返回 InvalidPart。列表必须按
PartNumber 升序排列且不允许重复,否则返回 InvalidPartOrder。列表不能为空,否则返回
InvalidArgument。PartNumber 不要求连续,可以跳号(例如只提交编号为1、3、5的分块)。未在列表中出现的已上传分块在合并时将被丢弃。最小分块大小
除请求体中
PartNumber 最大的分块(即合并后对象的最后一块)以外,其余每个分块的大小不得小于1MiB,否则返回 EntityTooSmall。最后一块不受此限制,可以小于1MiB。目标对象键
本接口要求 URL 路径中的
<ObjectKey> 与 InitiateMultipartUpload 调用时使用的对象键完全一致(包括大小写、路径层级与末尾 /),不一致时本接口返回 NoSuchUpload。防覆盖与同名冲突
携带
x-cos-forbid-overwrite: true 且目标文件对象已存在时,返回 409 FileAlreadyExists。目标对象键的同名目录对象已存在时,返回
409 DirAlreadyExists。目标对象键中的中间路径组件已是文件对象(例如目标键为
a/b/c 且 a/b 已是文件对象)时,返回 409 FileAlreadyExists。UploadId 有效性
请求
请求语法
POST /<ObjectKey>?uploadId=<UploadId> HTTP/1.1Host: <BucketName-APPID>.cosrapid.<Region>.myqcloud.comDate: <GMT Date>Content-Type: application/xmlContent-Length: <Content Length>Authorization: <Auth String><CompleteMultipartUpload><Part><PartNumber>integer</PartNumber><ETag>string</ETag></Part>...</CompleteMultipartUpload>
说明:
请求参数
参数名称 | 描述 | 类型 | 是否必选 |
uploadId | string | 是 |
请求头部
Header 名称 | 描述 | 类型 | 是否必选 |
x-cos-forbid-overwrite | 是否禁止覆盖同名对象,取值为 true 时启用。行为契约详见「防覆盖与同名冲突」 | string | 否 |
请求体
提交 application/xml 请求数据,包含所有分块信息:
<CompleteMultipartUpload><Part><PartNumber>integer</PartNumber><ETag>string</ETag></Part><Part><PartNumber>integer</PartNumber><ETag>string</ETag></Part></CompleteMultipartUpload>
具体节点说明:
节点名称 | 父节点 | 描述 | 类型 | 是否必选 |
CompleteMultipartUpload | 无 | 包含本次合并请求中所有分块的信息 | Container | 是 |
Part | CompleteMultipartUpload | 单个分块的信息条目 | Container | 是 |
PartNumber | CompleteMultipartUpload.Part | 分块编号,与上传该分块时使用的 partNumber 一致 | integer | 是 |
ETag | CompleteMultipartUpload.Part | string | 是 |
响应
响应头部
Header 名称 | 描述 | 类型 | 是否必返 |
ETag | 合并后对象的 ETag,使用双引号包裹 | string | 是 |
Last-Modified | 合并后对象的最后修改时间,格式为 RFC 1123 GMT,例如 Wed, 29 May 2019 04:10:12 GMT | string | 是 |
x-cos-hash-crc64ecma | 合并后对象的 CRC64-ECMA 校验值,十进制字符串 | string | 是 |
x-cos-storage-class | 合并后对象的存储类型,固定为 RAPID | string | 是 |
响应体
响应体为 application/xml 格式:
<?xml version="1.0" encoding="UTF-8"?><CompleteMultipartUploadResult><Bucket>string</Bucket><Key>string</Key><ETag>string</ETag></CompleteMultipartUploadResult>
具体节点说明:
节点名称 | 父节点 | 描述 | 类型 |
CompleteMultipartUploadResult | 无 | 保存 CompleteMultipartUpload 结果的所有信息 | Container |
Bucket | CompleteMultipartUploadResult | 目标存储桶名称,形式为 <BucketName-APPID> | string |
Key | CompleteMultipartUploadResult | 目标对象键 | string |
ETag | CompleteMultipartUploadResult | 合并后对象的 ETag,使用双引号包裹(XML 实体编码形式) | string |
错误码
实际案例
案例一:完成一次分块上传
请求
POST /exampleobject?uploadId=1585130821cbb7df1d11846c073ad648e8f33b087cec2381df437acdc833cf654b9ecc6361 HTTP/1.1Host: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.comDate: Wed, 29 May 2019 04:10:12 GMTContent-Type: application/xmlContent-Length: 353Authorization: q-sign-algorithm=sha1&q-ak=AKIDXXXXXXXX&q-sign-time=1559074212;1559077812&q-key-time=1559074212;1559077812&q-header-list=content-length;content-type;date;host&q-url-param-list=uploadid&q-signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<CompleteMultipartUpload><Part><PartNumber>1</PartNumber><ETag>"39270a968a357d24207e9911162507eb"</ETag></Part><Part><PartNumber>2</PartNumber><ETag>"d899fbd1e06109ea2e4550f5751c88d6"</ETag></Part><Part><PartNumber>3</PartNumber><ETag>"762890d6c9a871b7bd136037cb2260cd"</ETag></Part></CompleteMultipartUpload>
响应
HTTP/1.1 200 OKContent-Type: application/xmlConnection: keep-aliveDate: Wed, 29 May 2019 04:10:12 GMTETag: "aa259a62513358f69e98e72e59856d88"Last-Modified: Wed, 29 May 2019 04:10:12 GMTx-cos-hash-crc64ecma: 2290339086971918696x-cos-storage-class: RAPIDx-cos-request-id: NjUwMDAwMDAwMDAwMDAwMDAw<?xml version="1.0" encoding="UTF-8"?><CompleteMultipartUploadResult><Bucket>examplebucket-x--1250000000</Bucket><Key>exampleobject</Key><ETag>"aa259a62513358f69e98e72e59856d88"</ETag></CompleteMultipartUploadResult>
案例二:使用 x-cos-forbid-overwrite 防覆盖
本案例在请求中携带
x-cos-forbid-overwrite: true,要求目标对象已存在时拒绝合并。请求
POST /exampleobject?uploadId=1585130821cbb7df1d11846c073ad648e8f33b087cec2381df437acdc833cf654b9ecc6361 HTTP/1.1Host: examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.comDate: Wed, 29 May 2019 04:10:12 GMTContent-Type: application/xmlContent-Length: 153x-cos-forbid-overwrite: trueAuthorization: q-sign-algorithm=sha1&q-ak=AKIDXXXXXXXX&q-sign-time=1559074212;1559077812&q-key-time=1559074212;1559077812&q-header-list=content-length;content-type;date;host;x-cos-forbid-overwrite&q-url-param-list=uploadid&q-signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<CompleteMultipartUpload><Part><PartNumber>1</PartNumber><ETag>"108f528eb63b65e734f27ae331f5ffaa"</ETag></Part></CompleteMultipartUpload>
响应
HTTP/1.1 409 ConflictContent-Type: application/xmlConnection: keep-aliveDate: Wed, 29 May 2019 04:10:12 GMTx-cos-request-id: NjUwMDAwMDAwMDAwMDAwMDAw<?xml version='1.0' encoding='utf-8'?><Error><Code>FileAlreadyExists</Code><Message>File already exists.</Message><Resource>examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.com/exampleobject</Resource><RequestId>NjUwMDAwMDAwMDAwMDAwMDAw</RequestId><TraceId></TraceId></Error>