閱讀484 返回首頁    go 搜狐


CopyObject__關於Object操作_API 參考_對象存儲 OSS-阿裏雲

拷貝一個在OSS上已經存在的object成另外一個object,可以發送一個PUT請求給OSS,並在PUT請求頭中添加元素“x-oss-copy-source”來指定拷貝源。OSS會自動判斷出這是一個Copy操作,並直接在服務器端執行該操作。如果拷貝成功,則返回新的object信息給用戶。該操作適用於拷貝小於1GB的文件,當拷貝一個大於1GB的文件時,必須使用Multipart Upload操作,具體見Upload Part Copy。

請求語法

  1. PUT /DestObjectName HTTP/1.1
  2. Host: DestBucketName.oss-cn-hangzhou.aliyuncs.com
  3. Date: GMT Date
  4. Authorization: SignatureValue
  5. 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)

名稱 描述
CopyObjectResult Copy 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. 如果文件類型為符號鏈接,隻拷貝符號鏈接。

    示例

請求示例:

  1. PUT /copy_oss.jpg HTTP/1.1
  2. Host: oss-example.oss-cn-hangzhou.aliyuncs.com
  3. Date: Fri, 24 Feb 2012 07:18:48 GMT
  4. x-oss-copy-source: /oss-example/oss.jpg
  5. Authorization: OSS qn6qrrqxo2oawuk53otfjbyc:gmnwPKuu20LQEjd+iPkL259A+n0=

返回示例:

  1. HTTP/1.1 200 OK
  2. x-oss-request-id: 559CC9BDC755F95A64485981
  3. Content-Type: application/xml
  4. Content-Length: 193
  5. Connection: keep-alive
  6. Date: Fri, 24 Feb 2012 07:18:48 GMT
  7. Server: AliyunOSS
  8. <?xml version="1.0" encoding="UTF-8"?>
  9. <CopyObjectResult xmlns=”https://doc.oss-cn-hangzhou.aliyuncs.com”>
  10. <LastModified>Fri, 24 Feb 2012 07:18:48 GMT</LastModified>
  11. <ETag>"5B3C1A2E053D763E1B002CC607C5A0FE"</ETag>
  12. </CopyObjectResult>

最後更新:2016-11-23 17:16:08

  上一篇:go PutObject__關於Object操作_API 參考_對象存儲 OSS-阿裏雲
  下一篇:go GetObject__關於Object操作_API 參考_對象存儲 OSS-阿裏雲