閱讀653 返回首頁    go 微軟 go windows


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

Post Object使用HTML表單上傳文件到指定bucket。Post作為Put的替代品,使得基於瀏覽器上傳文件到bucket成為可能。Post Object的消息實體通過多重表單格式(multipart/form-data)編碼,在Put Object操作中參數通過HTTP請求頭傳遞,在Post操作中參數則作為消息實體中的表單域傳遞。

Post object

請求語法

  1. POST / HTTP/1.1
  2. Host: BucketName.oss-cn-hangzhou.aliyuncs.com
  3. User-Agent: browser_data
  4. Content-Length:ContentLength
  5. Content-Type: multipart/form-data; boundary=9431149156168
  6. --9431149156168
  7. Content-Disposition: form-data; name="key"
  8. key
  9. --9431149156168
  10. Content-Disposition: form-data; name="success_action_redirect"
  11. success_redirect
  12. --9431149156168
  13. Content-Disposition: form-data; name="Content-Disposition"
  14. attachment;filename=oss_download.jpg
  15. --9431149156168
  16. Content-Disposition: form-data; name="x-oss-meta-uuid"
  17. myuuid
  18. --9431149156168
  19. Content-Disposition: form-data; name="x-oss-meta-tag"
  20. mytag
  21. --9431149156168
  22. Content-Disposition: form-data; name="OSSAccessKeyId"
  23. access-key-id
  24. --9431149156168
  25. Content-Disposition: form-data; name="policy"
  26. encoded_policy
  27. --9431149156168
  28. Content-Disposition: form-data; name="Signature"
  29. signature
  30. --9431149156168
  31. Content-Disposition: form-data; name="file"; filename="MyFilename.jpg"
  32. Content-Type: image/jpeg
  33. file_content
  34. --9431149156168
  35. Content-Disposition: form-data; name="submit"
  36. Upload to OSS
  37. --9431149156168--

表單域

名稱 描述 必須
OSSAccessKeyId Bucket 擁有者的Access Key Id。
類型:字符串
默認值:無
限製:當bucket非public-read-write或者提供了policy(或Signature)表單域時,必須提供該表單域。
有條件的
policy policy規定了請求的表單域的合法性。不包含policy表單域的請求被認為是匿名請求,並且隻能訪問public-read-write的bucket。更詳細描述請參照5.7.4.1 Post Policy。
類型:字符串
默認值:無
限製:當bucket非public-read-write或者提供了OSSAccessKeyId(或Signature)表單域時,必須提供該表單域。
有條件的
Signature 根據Access Key Secret和policy計算的簽名信息,OSS驗證該簽名信息從而驗證該Post請求的合法性。更詳細描述請參照5.7.4.2 Post Signature。
類型:字符串
默認值:無
限製:當bucket非public-read-write或者提供了OSSAccessKeyId(或policy)表單域時,必須提供該表單域。
有條件的
Cache-Control, Content-Type, Content-Disposition, Content-Encoding, Expires REST請求頭,更多的信息見Put Object。
類型:字符串
默認值:無
可選
file 文件或文本內容,必須是表單中的最後一個域。瀏覽器會自動根據文件類型來設置Content-Type,會覆蓋用戶的設置。 OSS一次隻能上傳一個文件。
類型:字符串
默認值:無
必須
key 上傳文件的object名稱。 如果需要使用用戶上傳的文件名稱作為object名,使用${filename}變量。例如:如果用戶上傳了文件b.jpg,而key域的值設置為/user/a/${filename},最終的object名為/user/a/b.jpg。 如果文件名包含路徑,則去除文件名中的路徑,例如用戶上傳了文件a/b/c/b.jpg,則取文件名為b.jpg,若key域的值設置為/user/a/${filename},最終的object名為/user/a/b.jpg
類型:字符串
默認值:無
必須
success_action_redirect 上傳成功後客戶端跳轉到的URL,如果未指定該表單域,返回結果由success_action_status表單域指定。如果上傳失敗,OSS返回錯誤碼,並不進行跳轉。
類型:字符串
默認值:無
可選
success_action_status 未指定success_action_redirect表單域時,該表單域指定了上傳成功後返回給客戶端的狀態碼。 接受值為200, 201, 204(默認)。 如果該域的值為200或者204,OSS返回一個空文檔和相應的狀態碼。 如果該域的值設置為201,OSS返回一個XML文件和201狀態碼。 如果其值未設置或者設置成一個非法值,OSS返回一個空文檔和204狀態碼。
類型:字符串
默認值:無
可選
x-oss-meta-* 用戶指定的user meta值。 OSS不會檢查或者使用該值。
類型:字符串
默認值:無
可選
x-oss-server-side-encryption 指定OSS創建object時的服務器端加密編碼算法。
類型:字符串
合法值:AES256
可選
x-oss-object-acl 指定oss創建object時的訪問權限。
類型:字符串
合法值:public-read,private,public-read-write
可選
x-oss-security-token 若本次訪問是使用STS臨時授權方式,則需要指定該項為SecurityToken的值,同時OSSAccessKeyId需要使用與之配對的臨時AccessKeyId,計算簽名時,與使用普通AccessKeyId簽名方式一致。
類型:字符串
默認值:無
可選

響應Header

名稱 描述
x-oss-server-side-encryption 如果請求指定了x-oss-server-side-encryption熵編碼,則響應Header中包含了該頭部,指明了所使用的加密算法。
類型:字符串

響應元素(Response Elements)

名稱 描述
PostResponse 保持Post請求結果的容器。
類型:容器
子節點:Bucket, ETag, Key, Location
Bucket Bucket名稱。
類型:字符串
父節點:PostResponse
ETag ETag (entity tag) 在每個Object生成的時候被創建,Post請求創建的Object,ETag值是該Object內容的uuid,可以用於檢查該Object內容是否發生變化。
類型:字符串
父節點:PostResponse
Location 新創建Object的URL。
類型:字符串
父節點:PostResponse

細節分析

  1. 進行Post操作要求對bucket有寫權限,如果bucket為public-read-write,可以不上傳簽名信息,否則要求對該操作進行簽名驗證。與Put操作不同,Post操作使用AccessKeySecret對policy進行簽名計算出簽名字符串作為Signature表單域的值,OSS會驗證該值從而判斷簽名的合法性。
  2. 無論bucket是否為public-read-write,一旦上傳OSSAccessKeyId, policy, Signature表單域中的任意一個,則另兩個表單域為必選項,缺失時OSS會返回錯誤碼:InvalidArgument。
  3. post操作提交表單編碼必須為“multipart/form-data”,即header中Content-Type為multipart/form-data; boundary=xxxxxx這樣的形式,boundary為邊界字符串。
  4. 提交表單的URL為bucket域名即可,不需要在URL中指定object。即請求行是POST / HTTP/1.1,不能寫成POST /ObjectName HTTP/1.1
  5. policy規定了該次Post請求中表單域的合法值,OSS會根據policy判斷請求的合法性,如果不合法會返回錯誤碼:AccessDenied。在檢查policy合法性時,policy中不涉及的表單域不進行檢查。
  6. 表單和policy必須使用UTF-8編碼,policy為經過UTF-8編碼和base64編碼的JSON。
  7. Post請求中可以包含額外的表單域,OSS會根據policy對這些表單域檢查合法性。
  8. 如果用戶上傳了Content-MD5請求頭,OSS會計算body的Content-MD5並檢查一致性,如果不一致,將返回InvalidDigest錯誤碼。
  9. 如果POST請求中包含Header簽名信息或URL簽名信息,OSS不會對它們做檢查。
  10. 如果請求中攜帶以x-oss-meta-為前綴的表單域,則視為user meta,比如x-oss-meta-location。一個Object可以有多個類似的參數,但所有的user meta總大小不能超過8k。
  11. Post請求的body總長度不允許超過5G。若文件長度過大,會返回錯誤碼:EntityTooLarge。
  12. 如果上傳指定了x-oss-server-side-encryption Header請求域,則必須設置其值為AES256,否則會返回400和錯誤碼:InvalidEncryptionAlgorithmError。指定該Header後,在響應頭中也會返回該Header,OSS會對上傳的Object進行加密編碼存儲,當這個Object被下載時,響應頭中會包含x-oss-server-side-encryption,值被設置成該Object的加密算法。
  13. 表單域為大小寫不敏感的,但是表單域的值為大小寫敏感的。

示例

請求示例:

  1. POST / HTTP/1.1
  2. Host: oss-example.oss-cn-hangzhou.aliyuncs.com
  3. Content-Length: 344606
  4. Content-Type: multipart/form-data; boundary=9431149156168
  5. --9431149156168
  6. Content-Disposition: form-data; name="key"
  7. /user/a/${filename}
  8. --9431149156168
  9. Content-Disposition: form-data; name="success_action_status"
  10. 200
  11. --9431149156168
  12. Content-Disposition: form-data; name="Content-Disposition"
  13. content_disposition
  14. --9431149156168
  15. Content-Disposition: form-data; name="x-oss-meta-uuid"
  16. uuid
  17. --9431149156168
  18. Content-Disposition: form-data; name="x-oss-meta-tag"
  19. metadata
  20. --9431149156168
  21. Content-Disposition: form-data; name="OSSAccessKeyId"
  22. 44CF9590006BF252F707
  23. --9431149156168
  24. Content-Disposition: form-data; name="policy"
  25. eyJleHBpcmF0aW9uIjoiMjAxMy0xMi0wMVQxMjowMDowMFoiLCJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsIDAsIDEwNDg1NzYwXSx7ImJ1Y2tldCI6ImFoYWhhIn0sIHsiQSI6ICJhIn0seyJrZXkiOiAiQUJDIn1dfQ==
  26. --9431149156168
  27. Content-Disposition: form-data; name="Signature"
  28. kZoYNv66bsmc10+dcGKw5x2PRrk=
  29. --9431149156168
  30. Content-Disposition: form-data; name="file"; filename="MyFilename.txt"
  31. Content-Type: text/plain
  32. abcdefg
  33. --9431149156168
  34. Content-Disposition: form-data; name="submit"
  35. Upload to OSS
  36. --9431149156168--

返回示例:

  1. HTTP/1.1 200 OK
  2. x-oss-request-id: 61d2042d-1b68-6708-5906-33d81921362e
  3. Date: Fri, 24 Feb 2014 06:03:28 GMT
  4. ETag: 5B3C1A2E053D763E1B002CC607C5A0FE
  5. Connection: keep-alive
  6. Content-Length: 0
  7. Server: AliyunOSS

Post Policy

Post請求的policy表單域用於驗證請求的合法性。 policy為一段經過UTF-8和base64編碼的JSON文本,聲明了Post請求必須滿足的條件。雖然對於public-read-write的bucket上傳時,post表單域為可選項,我們強烈建議使用該域來限製Post請求。

policy示例

  1. { "expiration": "2014-12-01T12:00:00.000Z",
  2. "conditions": [
  3. {"bucket": "johnsmith" },
  4. ["starts-with", "$key", "user/eric/"]
  5. ]
  6. }

Post policy中必須包含expiration和condtions。

Expiration

Expiration項指定了policy的過期時間,以ISO8601 GMT時間表示。例如”2014-12-01T12:00:00.000Z”指定了Post請求必須發生在2014年12月1日12點之前。

Conditions

Conditions是一個列表,可以用於指定Post請求的表單域的合法值。注意:表單域對應的值在檢查policy之後進行擴展,因此,policy中設置的表單域的合法值應當對應於擴展之前的表單域的值。例如,如果設置key表單域為user/user1/${filename},用戶的文件名為a.txt,則Post policy應當設置成[“eq”, “$key”, “user/user1/${filename}”],而不是[“eq”, “$key”,“$key”, “user/user1/a.txt”]。Policy中支持的conditions項見下表:

名稱 描述
content-length-range 上傳文件的最小和最大允許大小。 該condition支持contion-length-range匹配方式。
Cache-Control, Content-Type, Content-Disposition, Content-Encoding, Expires HTTP請求頭。 該condition支持精確匹配和starts-with匹配方式。
key 上傳文件的object名稱。 該condition支持精確匹配和starts-with匹配方式。
success_action_redirect 上傳成功後的跳轉URL地址。 該condition支持精確匹配和starts-with匹配方式。
success_action_status 未指定success_action_redirect時,上傳成功後的返回狀態碼。 該condition支持精確匹配和starts-with匹配方式。
x-oss-meta-* 用戶指定的user meta。 該condition支持精確匹配和starts-with匹配方式。

如果Post請求中包含其他的表單域,可以將這些額外的表單域加入到policy的conditions中,conditions不涉及的表單域將不會進行合法性檢查。

Conditions匹配方式

Conditions匹配方式 描述
精確匹配 表單域的值必須精確匹配conditions中聲明的值。如指定key表單域的值必須為a: {“key”: “a”} 同樣可以寫為: [“eq”, “$key”, “a”]
Starts With 表單域的值必須以指定值開始。例如指定key的值必須以/user/user1開始: [“starts-with”, “$key”, “/user/user1”]
指定文件大小 指定所允許上傳的文件最大大小和最小大小,例如允許的文件大小為1到10字節: [“content-length-range”, 1, 10]

轉義字符

於在 Post policy 中 $ 表示變量,所以如果要描述 $,需要使用轉義字符$。除此之外,JSON 將對一些字符進行轉義。下圖描述了 Post policy 的 JSON 中需要進行轉義的字符。

轉義字符 描述
/ 斜杠
反斜杠
雙引號
$ 美元符
b 空格
f 換頁
n 換行
r 回車
t 水平製表符
uxxxx Unicode 字符

Post Signature

對於驗證的Post請求,HTML表單中必須包含policy和Signature信息。policy控製請求中那些值是允許的。計算Signature的具體流程為:

  1. 創建一個 UTF-8 編碼的 policy。
  2. 將 policy 進行 base64 編碼,其值即為 policy 表單域該填入的值,將該值作為將要簽名的字符串。
  3. 使用 AccessKeySecret 對要簽名的字符串進行簽名,簽名方法與Head中簽名的計算方法相同(將要簽名的字符串替換為 policy 即可)。

示例 Demo

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

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