PutObject介面用於上傳檔案。

請求文法

PUT /ObjectName HTTP/1.1
Content-Length:ContentLength
Content-Type: ContentType
Host: BucketName.oss-cn-hangzhou.aliyuncs.com
Date: GMT Date
Authorization: SignatureValue

請求Header

表 1. 請求Header
名稱 類型 描述
Cache-Control 字元串 指定該Object被下載時的網頁的緩存行為;更詳細描述請參照RFC2616

預設值:無

Content-Disposition 字元串 指定該Object被下載時的名稱;更詳細描述請參照RFC2616

預設值:無

Content-Encoding 字元串 指定該Object被下載時的內容編碼格式;更詳細描述請參照RFC2616

預設值:無

Content-Md5 字元串 根據協議RFC 1864對消息內容(不包括頭部)計算Md5值獲得128位元位元字,對該數字進行base64編碼為一個消息的Content-Md5值。該要求標頭可用於消息合法性的檢查(消息內容是否與發送時一致)。雖然該要求標頭是可選項,OSS建議用戶使用該要求標頭進行端到端檢查。

預設值:無

限制:無

Expires 字元串 過期時間;更詳細描述請參照RFC2616

預設值:無

说明
OSS不會對這個值進行限制和驗證。
x-oss-server-side-encryption 字元串 指定oss建立object時的伺服器端加密編碼演算法。

合法值:AES256 KMS

说明
您需要購買KMS套件,才可以使用KMS密碼編譯演算法,否則會報KmsServiceNotEnabled錯誤碼
x-oss-object-acl 字元串 指定oss建立object時的存取權限。

合法值:public-readprivatepublic-read-write

細節分析

  • 如果用戶上傳了Content-Md5要求標頭,OSS會計算body的Content-Md5並檢查一致性,如果不一致,將返回InvalidDigest錯誤碼。
  • 如果要求標頭中的“Content-Length”值小於實際請求體(body)中傳輸的數據長度,OSS仍將成功建立檔案;但Object大小隻等於“Content-Length”中定義的大小,其他數據將被丟棄。
  • 如果試圖添加的Object的同名檔案已經存在,並且有存取權限。新添加的檔案將覆蓋原來的檔案,成功返回200 OK。
  • 如果在PutObject的時候,攜帶以x-oss-meta-為首碼的參數,則視為user meta,比如x-oss-meta-location。一個Object可以有多個類似的參數,但所有的user meta總大小不能超過8k。
  • 如果Header不是chunked encoding編碼方式,且沒有加入Content length參數,會返回411 Length Required錯誤。錯誤碼:MissingContentLength。
  • 如果設定了長度,但是沒有發送消息Body,或者發送的body大小小於給定大小,伺服器會一直等待,直到time out,返回400 Bad Request消息。錯誤碼:RequestTimeout。
  • 如果試圖添加的Object所在的Bucket不存在,返回404 Not Found錯誤。錯誤碼:NoSuchBucket。
  • 如果試圖添加的Object所在的Bucket沒有存取權限,返回403 Forbidden錯誤。錯誤碼:AccessDenied。
  • 如果添加檔案長度超過5G,返回錯誤訊息400 Bad Request。錯誤碼:InvalidArgument。
  • 如果傳入的Object key長度大於1023位元組,返回400 Bad Request。錯誤碼:InvalidObjectName。
  • PUT一個Object的時候,OSS支援5個 HTTP RFC2616協議規定的Header 欄位:Cache-Control、Expires、Content-Encoding、Content-Disposition、Content-Type。如果上傳Object時設定了這些Header,則這個Object被下載時,相應的Header值會被自動化佈建成上傳時的值。
  • 如果上傳Object時指定了x-oss-server-side-encryption Header,則必須設定其值為AES256,否則會返回400和相應錯誤提示:InvalidEncryptionAlgorithmError。指定該Header後,在回應標頭中也會返回該Header,OSS會對上傳的Object進行加密編碼儲存,當這個Object被下載時,回應標頭中會包含x-oss-server-side-encryption,值被設定成該Object的密碼編譯演算法。

常見問題

  • Content-Md5計算方式錯誤

    以上傳的內容為 0123456789 為例,計算這個字元串的Content-Md5。

以上傳的內容為"123456789"來說,計算這個字元串的Content-Md5 正確的計算方式:標準中定義的演算法為: 先計算Md5加密的位元組(128位),再對這個二進位進行base64編碼(而不是對32位字元串編碼)。 以Python為例子,正確計算的代碼為:

>>> import base64,hashlib
>>> hash = hashlib.md5()
>>> hash.update("0123456789")
>>> base64.b64encode(hash.digest())
'eB5eJF1ptWaXm4bijSPyxw=='
需要注意正確的是: hash.digest(),計算出進位數組(128位) >>> hash.digest() 'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'。常見錯誤是直接對計算出的32位字元串編碼進行base64編碼。 例如,錯誤的是: hash.hexdigest(),計算得到可見的32位字元串編碼 >>> hash.hexdigest() '781e5e245d69b566979b86e28d23f2c7' 錯誤的Md5值進行base64編碼後的結果: >>> base64.b64encode(hash.hexdigest()) 'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='

樣本

請求樣本:

PUT /oss.jpg HTTP/1.1
Host: oss-example.oss-cn-hangzhou.aliyuncs.com
Cache-control: no-cache
Expires: Fri, 28 Feb 2012 05:38:42 GMT
Content-Encoding: utf-8
Content-Disposition: attachment;filename=oss_download.jpg
Date: Fri, 24 Feb 2012 06:03:28 GMT
Content-Type: image/jpg
Content-Length: 344606
Authorization: OSS qn6qrrqxo2oawuk53otfjbyc:kZoYNv66bsmc10+dcGKw5x2PRrk=

[344606 bytes of object data]

返回樣本:

HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 21 Nov 2015 18:52:34 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 5650BD72207FB30443962F9A
x-oss-bucket-version: 1418321259
ETag: "A797938C31D59EDD08D86188F6D5B872"