开发者社区> 问答> 正文

关于Object操作之如何实现CopyObject?


Copy Object


拷贝一个在OSS上已经存在的object成另外一个object,可以发送一个PUT请求给OSS,并在PUT请求头中添加元素“x-oss-copy-source”来指定拷贝源。OSS会自动判断出这是一个Copy操作,并直接在服务器端执行该操作。如果拷贝成功,则返回新的object信息给用户。该操作适用于拷贝小于1GB的文件,当拷贝一个大于1GB的文件时,必须使用Multipart Upload操作,具体见Upload Part Copy。

请求语法PUT /DestObjectName HTTP/1.1
Host: DestBucketName.oss-cn-hangzhou.aliyuncs.com
Date: GMT Date
Authorization: SignatureValue
x-oss-copy-source: /SourceBucketName/SourceObjectName





请求Header

名称描述
x-oss-copy-source复制源地址(必须有可读权限) 类型:字符串 默认值:无
x-oss-copy-source-if-match如果源Object的ETag值和用户提供的ETag相等,则执行拷贝操作,并返回200;否则返回412 HTTP错误码(预处理失败)。 类型:字符串 默认值:无
x-oss-copy-source-if-none-match如果源Object的ETag值和用户提供的ETag不相等,则执行拷贝操作,并返回200;否则返回304 HTTP错误码(预处理失败)。 类型:字符串 默认值:无
x-oss-copy-source-if-unmodified-since如果传入参数中的时间等于或者晚于文件实际修改时间,则正常传输文件,并返回200 OK;否则返回412 precondition failed错误。 类型:字符串 默认值:无
x-oss-copy-source-if-modified-since如果源Object自从用户指定的时间以后被修改过,则执行拷贝操作;否则返回304 HTTP错误码(预处理失败)。 类型:字符串 默认值:无
x-oss-metadata-directive有效值为COPY和REPLACE。如果该值设为COPY,则新的Object的meta都从源Object复制过来;如果设为REPLACE,则忽视所有源Object的meta值,而采用用户这次请求中指定的meta值;其他值则返回400 HTTP错误码。注意该值为COPY时,源Object的x-oss-server-side-encryption的meta值不会进行拷贝。类型:字符串 默认值:COPY 有效值:COPY、REPLACE
x-oss-server-side-encryption指定oss创建目标object时的服务器端熵编码加密算法 类型:字符串 有效值:AES256
x-oss-object-acl指定oss创建object时的访问权限。 类型:字符串 合法值:public-read,private,public-read-write


响应元素(Response Elements)

名称描述
CopyObjectResultCopy Object结果类型:字符串默认值:无
ETag新Object的ETag值。类型:字符串父元素:CopyObjectResult
LastModified新Object最后更新时间。类型:字符串父元素:CopyObjectResult


细节分析

  1. 可以通过拷贝操作来实现修改已有Object的meta信息。
  2. 如果拷贝操作的源Object地址和目标Object地址相同,则无论x-oss-metadata-directive为何值,都会直接替换源Object的meta信息。
  3. OSS支持拷贝操作的四个预判断Header任意个同时出现,相应逻辑参见Get Object操作的细节分析。
  4. 拷贝操作需要请求者对源Object有读权限。
  5. 源Object和目标Object必须属于同一个数据中心,否则返回403 AccessDenied,错误信息为:Target object does not reside in the same data center as source object。
  6. 拷贝操作的计费统计会对源Object所在的Bucket增加一次Get请求次数,并对目标Object所在的Bucket增加一次Put请求次数,以及相应的新增存储空间。
  7. 拷贝操作涉及到的请求头,都是以“x-oss-”开头的,所以要加入签名字符串中。
  8. 若在拷贝操作中指定了x-oss-server-side-encryption请求头,并且请求值合法(为AES256),则无论源Object是否进行过服务器端加密编码,拷贝之后的目标Object都会进行服务器端加密编码。并且拷贝操作的响应头中会包含x-oss-server-side-encryption,值被设置成目标Object的加密算法。在这个目标Object被下载时,响应头中也会包含x-oss-server-side-encryption,值被设置成该Object的加密算法;若拷贝操作中未指定x-oss-server-side-encryption请求头,则无论源Object是否进行过服务器端加密编码,拷贝之后的目标Object都是未进行过服务器端加密编码加密的数据。
  9. 拷贝操作中x-oss-metadata-directive请求头为COPY(默认值)时,并不拷贝源Object的x-oss-server-side-encryption值,即目标Object是否进行服务器端加密编码只根据COPY操作是否指定了x-oss-server-side-encryption请求头来决定。
  10. 若在拷贝操作中指定了x-oss-server-side-encryption请求头,并且请求值非AES256,则返回400和相应的错误提示:InvalidEncryptionAlgorithmError。
  11. 如果拷贝的文件大小大于1GB,会返回400和错误提示:EntityTooLarge。
  12. 该操作不能拷贝通过Append追加上传方式产生的object。
  13. 如果文件类型为[backcolor=transparent]符号链接,只拷贝符号链接。
  14. 如果Bucket的类型为Archive,则不能调用该接口,否则返回400错误,错误码为OperationNotSupported。

    示例


[backcolor=transparent]请求示例: PUT /copy_oss.jpg HTTP/1.1
Host: oss-example.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 24 Feb 2012 07:18:48 GMT
x-oss-copy-source: /oss-example/oss.jpg
Authorization: OSS qn6qrrqxo2oawuk53otfj byc:gmnwPKuu20LQEjd+iPkL259A+n0=


[backcolor=transparent]返回示例: HTTP/1.1 200 OK
x-oss-request-id: 559CC9BDC755F95A64485981
Content-Type: application/xml
Content-Length: 193
Connection: keep-alive
Date: Fri, 24 Feb 2012 07:18:48 GMT
Server: AliyunOSS
<?xml version="1.0" encoding="UTF-8"?>
<CopyObjectResult xmlns=”http://doc.oss-cn-hangzhou.aliyuncs.com”>
    <LastModified>Fri, 24 Feb 2012 07:18:48 GMT</LastModified>
    <ETag>"5B3C1A2E053D763E1B002CC607C5A0FE"</ETag>
</CopyObjectResult>

展开
收起
青衫无名 2017-10-20 11:13:59 5413 0
2 条回答
写回答
取消 提交回答
  • Re关于Object操作之如何实现CopyObject?
    如果拷贝文件过大,使用了copy_object,会产生读超时吗?
    2018-08-02 14:53:48
    赞同 展开评论 打赏
  • Re关于Object操作之如何实现CopyObject?
    这是纯copy的官方文章啊,我问问请求中的 Authorization: OSS qn6qrrqxo2oawuk53otfj byc:gmnwPKuu20LQEjd+iPkL259A+n0=  后面一段的签名究竟是针对什么数据签的名? 这块儿官方文章直接略过,这让我哪里去猜?
    2017-10-27 11:34:11
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
建立联系方法之一 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载