通过在UploadPart请求的基础上增加一个请求头x-oss-copy-source来调用UploadPartCopy接口,实现从一个已存在的Object中拷贝数据来上传一个Part。

注意事项

当拷贝一个大于1 GB的文件时,必须使用UploadPartCopy的方式进行拷贝。如果想通过单个操作拷贝小于1 GB的文件,请参见CopyObject

使用UploadPartCopy接口时,有如下注意事项:

  • 不允许拷贝以AppendObject方式上传的Object。
  • 执行UploadPartCopy的源Bucket地址和目标Bucket地址必须是同一个Region。
  • 调用该接口上传Part数据前,必须先调用InitiateMultipartUpload接口来获取一个OSS服务器颁发的Upload ID。
  • 若调用InitiateMultipartUpload接口时,指定了x-oss-server-side-encryption请求头,则会对上传的Part进行加密编码,并在UploadPart响应头中返回x-oss-server-side-encryption头,其值表明该Part的服务器端加密算法,详情请参见InitiateMultipartUpload
  • MultipartUpload要求除最后一个Part以外,其他的Part大小都要大于100 KB。因不确定是否为最后一个Part,UploadPart接口并不会立即校验上传Part的大小,只有当CompleteMultipartUpload的时候才会校验。

版本控制

UploadPartCopy默认从一个已存在的Object的当前版本中拷贝数据来上传一个Part。允许通过在请求头x-oss-copy-source中附带versionId的子条件,实现从Object的指定版本进行拷贝,例如x-oss-copy-source : /SourceBucketName/SourceObjectName?versionId=111111。
说明 SourceObjectName要进行URL编码。响应中将会返回被拷贝Object的versionId:x-oss-copy-source-version-id。

如果未指定versionId且拷贝Object的当前版本为删除标记(Delete Marker),OSS将返回404 Not Found。通过指定versionId来拷贝删除标记时,OSS将返回400 Bad Request。

请求语法

PUT /ObjectName? partNumber=PartNumber&uploadId=UploadId HTTP/1.1
Host: BucketName.oss-cn-hangzhou.aliyuncs.com
Date: GMT Date
Content-Length: Size
Authorization: SignatureValue
x-oss-copy-source: /SourceBucketName/SourceObjectName
x-oss-copy-source-range:bytes=first-last

请求头

除了通用的请求头,UploadPartCopy请求中通过下述请求头指定拷贝的源Object地址和拷贝的范围。

名称 类型 描述
x-oss-copy-source 字符串 拷贝源地址(必须有可读权限)。

默认值:无

x-oss-copy-source-range 整型 源Object的拷贝范围。例如设置bytes=0~9,表示拷贝0到9这10个字符。

默认值:无

  • 不指定该请求头时,表示拷贝整个源Object。
  • 当指定该请求头时,则返回消息中会包含整个文件的长度和此次拷贝的范围,例如:Content-Range: bytes 0~9/44,表示整个文件长度为44,此次拷贝的范围为0~9。
  • 当指定的范围不符合规范时,则拷贝整个源Object,并且不在结果中提及Content-Range。

下述请求Header作用于x-oss-copy-source指定的源Object。

名称 类型 描述
x-oss-copy-source-if-match 字符串 如果源Object的ETAG值和用户提供的ETAG相等,则执行拷贝操作;否则返回412 HTTP错误码(预处理失败)。

默认值:无

x-oss-copy-source-if-none-match 字符串 如果传入的ETag值和Object的ETag不匹配,则正常传输文件,并返回200 OK;否则返回304 Not Modified。

默认值:无

x-oss-copy-source-if-unmodified-since 字符串 如果传入参数中的时间等于或者晚于文件实际修改时间,则正常传输文件,并返回200 OK;否则返回412 precondition failed错误。

默认值:无

x-oss-copy-source-if-modified-since 字符串 如果指定的时间早于实际修改时间,则正常传送文件,并返回200 OK;否则返回304 not modified。

默认值:无

时间格式:GMT时间,例如Fri, 13 Nov 2015 14:47:53 GMT

示例

  • 请求示例
    PUT /multipart.data?partNumber=1&uploadId=0004B9895DBBB6EC98E36  HTTP/1.1
    Host: oss-example.oss-cn-hangzhou.aliyuncs.com
    Content-Length:6291456
    Date: Wed, 22 Feb 2012 08:32:21 GMT
    Authorization: OSS qn6qrrqxo2oawuk53otf****:J/lICfXEvPmmSW86bBAfMmUm****
    x-oss-copy-source: /oss-example/ src-object
    x-oss-copy-source-range:bytes=100-6291756
    返回示例
    HTTP/1.1 200 OK
    Server: AliyunOSS
    Connection: keep-alive
    x-oss-request-id: 3e6aba62-1eae-d246-6118-8ff42cd0****
    Date: Thu, 17 Jul 2014 06:27:54 GMT'
    <?xml version="1.0" encoding="UTF-8"?>
    <CopyPartResult xmlns=”http://doc.oss-cn-hangzhou.aliyuncs.com”>
        <LastModified>2014-07-17T06:27:54.000Z </LastModified>
        <ETag>"5B3C1A2E053D763E1B002CC607C5****"</ETag>
    </CopyPartResult>
  • 指定versionId进行UploadPartCopy的请求示例
    PUT /multipart.data?partNumber=2&uploadId=63C06A5CFF6F4AE4A6BB3AD7F01C****  HTTP/1.1
    Host: oss-example.oss-cn-hangzhou.aliyuncs.com
    Date: Tue, 09 Apr 2019 07:01:56 GMT
    Authorization: OSS 6jftttm6x6san0ewtgyk****:v/sJFtYvg7DTa4pJ2AMShZL/****
    x-oss-copy-source: /oss-example/src-object?versionId=CAEQMxiBgMC0vs6D0BYiIGJiZWRjOTRjNTg0NzQ1MTRiN2Y1OTYxMTdkYjQ0****
    返回示例
    HTTP/1.1 200 OK
    Server: AliyunOSS
    Connection: keep-alive
    x-oss-copy-source-version-id: CAEQMxiBgMC0vs6D0BYiIGJiZWRjOTRjNTg0NzQ1MTRiN2Y1OTYxMTdkYjQ0****
    x-oss-request-id: 5CAC4364B7AEADE017000660
    Date: Tue, 09 Apr 2019 07:01:56 GMT
    <?xml version="1.0" encoding="UTF-8"?>
    <CopyPartResult>
      <LastModified>2019-04-09T07:01:56.000Z</LastModified>
      <ETag>"25A9F4ABFCC05743DF6E2C886C56****"</ETag>
    </CopyPartResult>

SDK

此接口所对应的各语言SDK如下:

错误码

错误码 HTTP状态码 描述
OperationNotSupported 400 Bucket的类型为Archive时调用UploadPartCopy接口。