Skip to content
大纲

UploadPartCopy

接口描述

在调用 InitiateMultipartUpload 获取 UploadId 后,我们需要用 UploadPartCopy 命令来复制 Object 拆分后的数据分片(即 Part)。为了标识各个 Part 在 Object 的相对位置,在 UploadPartCopy 需要指定一个 partNumber 参数,partNumber 的取值范围是 1-10000,即每次三步复制最多可以有 10000 个part,最少 1 个 part。

说明:

  • 每次 Copy Part 最多可以复制 5G Bytes 的数据。
  • 三步复制得到的目的 Object 的 Meta 信息,不会从源 Object 复制而来,需要用户在 CompleteMultipartUpload 时重新上传,或者完成之后,通过CopyObject接口复制自身来更新Meta。
  • UploadPartCopy时,不同的part可能来自不同的Object,系统并不对此进行限制。
  • 三步复制不适用于Append Object,Append Object可以使用普通复制方法来完成备份和meta更新。

请求(Request)

请求语法

PUT /<ObjectName>?uploadId=UploadId&partNumber=PartNumber HTTP/1.1
Host: <BucketName>.fos.flymeyun.com
Date: <Date>
Content-Type: text/plain
Content-Length: <ContentLength>
x-fos-copy-source: /SrcBucket/SrcObject
x-fos-copy-source-range: bytes=0-9

请求头域

header是否必填描述
x-fos-copy-source复制源文件,比如/SrcBucket/SrcObject
x-fos-copy-source-range复制源文件的字节范围,必须使用 bytes=first-last 的格式,比如 bytes=0-9,代表复制前 10 个字节。如果不提供此 header,则复制整个文件。除最后一个 Part 外,每个 Part 分片需要大于等于 100 KB,小于等于 5GB,且整个 Object 大小不超过 48.8 TB。
x-fos-copy-source-if-match如果源文件的etag值与此header提供的相同,则复制,否则不复制
x-fos-copy-source-if-none-match如果源文件的etag值与此header提供的不相同,则复制,否则不复制
x-fos-copy-source-if-unmodifed-since如果源文件在此header提供的时间后未曾修改,则复制,否则不复制
x-fos-copy-source-if-modifed-since如果源文件在此header提供的时间后曾修改过,则复制,否则不复制

说明

各字段的格式与CopyObject接口对应字段相同。 假设Object内容为"0123456789",长度为10。x-fos-copy-source-range举例如下:

  • range: 0-3,拷贝"0123";
  • range: 4-,从下标为4的开始拷贝到文件结束即拷贝"456789";
  • range: -4,拷贝末尾4个即"6789"。

请求参数

名称类型参数位置描述
partNumberIntQuery参数此part在目的Object中的序号。partNum取值范围 1-10000,一次MultiPart的PartNumber要求必须严格有序,比如有3个Part,PartNumber可以是1,3,5。
uploadIdStringQuery参数InitiateMultipartUpload获取的UploadId

响应(Response)

响应元素

名称描述
ETag复制目的Object的ETag
lastModified目的Object的修改时间

注意事项

  1. UploadPartCopy会返回本次Part的ETag,在MultipartUpload的第三步中需要此ETag,也建议用户用ETag验证上传数据的正确性。
  2. 为了保持复制过程中的http连接,UploadPartCopy接口的http结果可能使用Transfer-Encoded: Chunked编码方式。
  3. UploadPartCopy过程中,如果发生服务器端错误,http status code可能返回2XX但是复制失败,复制结果请根据http body中的json判定。

示例

请求示例

PUT /ObjectName?uploadId=a44cc9bab11cbd156984767aad637851&partNumber=1 HTTP/1.1
Host: BucketName.fos.flymeyun.com
Date: <Date>
Content-Type: text/plain
Content-Length: 0
x-fos-copy-source: /SrcBucket/SrcObject
x-fos-copy-source-range: bytes=0-9

响应示例

HTTP/1.1 200 OK
Date: Thu, 12 May 2016 09:14:32 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
x-fos-debug-id: MTAuNjMuMTIzLjI3OlRodSwgMTIgTWF5IDIwMTYgMTc6MTQ6MzIgQ1NUOjg3MjkzODMwMA==
x-fos-request-id: bb90cc9c-2b80-462c-87a4-095e610c9a2f
Transfer-Encoding: chunked
{
    "lastModified":"2016-05-12T09:14:32Z",
    "eTag":"67b92a7c2a9b9c1809a6ae3295dcc127"
}

拷贝失败, 需要根据返回的json判断

HTTP/1.1 200 OK
Date: Thu, 12 May 2016 09:14:32 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
x-fos-debug-id: MTAuNjMuMTIzLjI3OlRodSwgMTIgTWF5IDIwMTYgMTc6MTQ6MzIgQ1NUOjg3MjkzODMwMA==
x-fos-request-id: bb90cc9c-2b80-462c-87a4-095e610c9a2f
Transfer-Encoding: chunked
{
    "code":"InternalError",
    "message":"We encountered an internal error. Please try again.",
    "requestId":"52454655-5345-4420-4259-204e47494e58"
}