調用PostObject用於通過HTML表單上傳的方式將檔案(Object)上傳到指定儲存空間(Bucket)。
注意事項
要通過HTML表單上傳的方式上傳檔案,您必須有
oss:PutObject
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。通過PostObject上傳的Object大小不能超過5 GB。
Post請求需要對Bucket擁有寫入權限。如果Bucket為public-read-write,可以不上傳簽名資訊,否則要求對該操作進行簽名驗證。
與Put操作不同,Post操作使用AccessKey Secret對policy進行簽名,計算出簽名字串作為Signature表單域的值,OSS通過驗證該值從而判斷簽名的合法性。
提交表單的URL為Bucket網域名稱,不需要在URL中指定Object。即請求行是
POST / HTTP/1.1
,不能寫為POST /ObjectName HTTP/1.1
。如果POST請求中包含Header簽名資訊或URL簽名資訊,OSS不會對此類資訊做檢查。
版本控制
在開啟了版本控制的Bucket中發起PostObject請求時,OSS將為新添加的Object自動產生唯一的版本ID,並在響應Header中通過x-oss-version-id的形式返回。
在暫停了版本控制的Bucket中發起PostObject請求時,OSS將為新添加的Object自動產生一個null的版本ID,並在響應Header中通過x-oss-version-id的形式返回。同一個Object僅允許一個null的版本ID。
請求文法
POST / HTTP/1.1
Host: BucketName.oss-cn-hangzhou.aliyuncs.com
User-Agent: browser_data
Content-Length:ContentLength
Content-Type: multipart/form-data; boundary=9431149156168
--9431149156168
Content-Disposition: form-data; name="key"
key
--9431149156168
Content-Disposition: form-data; name="success_action_redirect"
success_redirect
--9431149156168
Content-Disposition: form-data; name="Content-Disposition"
attachment;filename=oss_download.jpg
--9431149156168
Content-Disposition: form-data; name="x-oss-meta-uuid"
myuuid
--9431149156168
Content-Disposition: form-data; name="x-oss-meta-tag"
mytag
--9431149156168
Content-Disposition: form-data; name="OSSAccessKeyId"
access-key-id
--9431149156168
Content-Disposition: form-data; name="policy"
encoded_policy
--9431149156168
Content-Disposition: form-data; name="Signature"
signature
--9431149156168
Content-Disposition: form-data; name="file"; filename="MyFilename.jpg"
Content-Type: image/jpeg
file_content
--9431149156168
Content-Disposition: form-data; name="submit"
Upload to OSS
--9431149156168--
要求標頭
PostObject的訊息實體通過多重表單格式(multipart/form-data)編碼,在PutObject操作中參數通過HTTP要求標頭傳遞,在PostObject操作中參數作為訊息體中的表單域傳遞。
PostObject操作過程中不支援通過傳入x-oss-tagging要求標頭的方式為Object添加標籤。您可以在PostObject操作完成後調用PutObjectTagging介面為Object添加標籤。
名稱 | 類型 | 是否必選 | 描述 |
Content-Type | 字串 | 否 | 指定檔案的類型和網頁的編碼,確定瀏覽器讀取檔案的形式和編碼方式。 Post操作提交表單編碼必須為 boundary為邊界字串,是由表單隨機產生的一個隨機值,無需指定。如果通過SDK拼接表單,則SDK也會產生一個隨機值。 |
此介面還需要包含Host、Date等公用要求標頭。更多資訊,請參見公用要求標頭(Common Request Headers)。
表單元素
以下表格列舉了POST V1和V4簽名共有的表單元素。關於POST V4簽名專屬的表單元素,請參見V4簽名表單。關於POST V1簽名專屬的表單元素,請參見V1簽名表單。
file必須為最後一個表單域,除file以外的其他表單域無順序要求。
所有表單域的key大小不能超過8 KB,表單域的value不能超過2 MB。
名稱 | 類型 | 是否必選 | 描述 |
Cache-Control | 字串 | 否 | 指定該Object被下載時網頁的緩衝行為。更多資訊,請參見RFC 2616。 預設值:無 |
Content-Disposition | 字串 | 否 | 指定該Object被下載時的名稱。更多資訊,請參見RFC 2616。 預設值:無 |
Content-Encoding | 字串 | 否 | 指定該Object被下載時的內容編碼格式。更多資訊,請參見RFC 2616。 預設值:無 |
Expires | 字串 | 否 | 到期時間。更多資訊,請參見RFC 2616。 預設值:無 |
policy | 字串 | 是,有條件 | policy規定了請求表單域的合法性。不包含policy表單域的請求被認為是匿名請求,並只能訪問public-read-write的Bucket。 預設值:無 限制:當Bucket為非public-read-write或者提供了OSSAccessKeyId(或Signature)表單域時,必須提供policy表單域。 重要 表單和policy必須使用UTF-8編碼,且policy表單域要經過Base64編碼。 |
x-oss-server-side-encryption-key-id | 字串 | 否 | 表示KMS託管的使用者主要金鑰。 此選項僅當x-oss-server-side-encryption值為KMS時有效。 |
x-oss-content-type | 字串 | 否 | 由於瀏覽器會自動在檔案表單域中增加Content-Type,為瞭解決此問題,OSS支援使用者在Post請求體中增加x-oss-content-type,該項允許使用者指定Content-Type,且擁有最高優先順序。 優先順序順序:x-oss-content-type > file表單域的Content-Type 預設值:無 |
x-oss-forbid-overwrite | 字串 | 否 | 指定PostObject操作時是否覆蓋同名Object。 當目標Bucket處於已開啟或已暫停版本控制狀態時,x-oss-forbid-overwrite請求Header設定無效,即允許覆蓋同名Object。
設定x-oss-forbid-overwrite請求Header會導致QPS處理效能下降,如果您有大量的操作需要使用x-oss-forbid-overwrite要求標頭(QPS > 1000),請聯絡支援人員,避免影響您的業務。 |
x-oss-object-acl | 字串 | 否 | 在檔案表單域中指定Object的存取權限。此項支援在檔案表單域中指定。 取值:
關於存取權限的更多資訊,請參見設定Object ACL。 |
x-oss-storage-class | 字串 | 否 | 指定Object的儲存類型。 對於任意儲存類型的Bucket,如果上傳Object時指定此參數,則此次上傳的Object將儲存為指定的類型。例如在IA類型的Bucket中上傳Object時,如果指定x-oss-storage-class為Standard,則該Object直接儲存為Standard。 取值:
關於更多資訊,請參見儲存類型介紹。 |
key | 字串 | 是 | 上傳Object的名稱,無需編碼。如果名稱包含路徑,例如 預設值:無 |
success_action_redirect | 字串 | 否 | 上傳成功後用戶端跳轉到的URL。如果未指定該表單域,返回結果由success_action_status表單域指定。如果上傳失敗,OSS返回錯誤碼,並不進行跳轉。 預設值:無 |
success_action_status | 字串 | 否 | 未指定success_action_redirect表單域時,該表單域指定了上傳成功後返回給用戶端的狀態代碼。 有效值:200、201、204(預設)。
|
x-oss-meta-* | 字串 | 否 | 使用者指定的user meta值。 預設值:無 如果請求中攜帶以x-oss-meta-為首碼的表單域,則視為user meta,例如 說明 一個Object可以有多個類似的參數,但所有的user meta總大小不能超過8 KB。 |
x-oss-security-token | 字串 | 否 | 安全性權杖。僅當使用STS構造URL簽名時,才需要設定此參數。您可以通過調用STS服務的AssumeRole介面擷取安全性權杖。 預設值:無 |
file | 字串 | 是 | 檔案或常值內容,無需編碼。瀏覽器會自動根據檔案類型來設定Content-Type,並覆蓋使用者的設定。OSS一次只能上傳一個檔案。 預設值:無 重要 file必須為最後一個表單域。 |
回應標頭
名稱 | 類型 | 樣本值 | 描述 |
x-oss-server-side-encryption | 字串 | KMS | 如果請求Header中指定了x-oss-server-side-encryption,則響應Header中將包含該頭部,指明所使用的伺服器端密碼編譯演算法。 |
Content-MD5 | 字串 | 1B2M2Y8AsgTpgAmY7PhC**** | 表示檔案的MD5值。 重要 檔案的MD5值指的是用戶端上傳完成後擷取到的檔案MD5,並非響應體的MD5。 |
x-oss-hash-crc64ecma | 字串 | 316181249502703**** | 表示檔案的CRC64值。 |
x-oss-version-id | 字串 | CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0**** | 表示檔案的版本ID。僅當您將檔案上傳至已開啟版本控制狀態的Bucket時,會返回該回應標頭。 |
此介面還涉及其他公用回應標頭,例如Date、x-oss-request-id等。更多資訊,請參見公用回應標頭(Common Response Headers)。
響應元素
名稱 | 類型 | 描述 |
PostResponse | 容器 | 儲存Post請求結果的容器。 子節點:Bucket、ETag、Key、Location |
Bucket | 字串 | Bucket名稱。 父節點:PostResponse |
ETag | 字串 | ETag (Entity Tag) 在每個Object產生的時候被建立。Post請求建立的Object,ETag值是基於一定計算規則產生的唯一值,但不是其內容的MD5值。ETag值可以用於檢查該Object內容是否發生變化。 父節點:PostResponse |
Location | 字串 | 新建立Object的URL。 父節點:PostResponse |
樣本
請求樣本:
POST / HTTP/1.1 Host: oss-example.oss-cn-hangzhou.aliyuncs.com Content-Length: 344606 Content-Type: multipart/form-data; boundary=9431149156168 --9431149156168 Content-Disposition: form-data; name="key" /user/a/objectName.txt --9431149156168 Content-Disposition: form-data; name="success_action_status" 200 --9431149156168 Content-Disposition: form-data; name="Content-Disposition" content_disposition --9431149156168 Content-Disposition: form-data; name="x-oss-meta-uuid" uuid --9431149156168 Content-Disposition: form-data; name="x-oss-meta-tag" metadata --9431149156168 Content-Disposition: form-data; name="OSSAccessKeyId" 44CF9590006BF252**** --9431149156168 Content-Disposition: form-data; name="policy" eyJleHBpcmF0aW9uIjoiMjAxMy0xMi0wMVQxMjowMDowMFoiLCJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsIDAsIDEwNDg1NzYwXSx7ImJ1Y2tldCI6ImFoYWhhIn0sIHsiQSI6ICJhIn0seyJrZXkiOiAiQUJDIn1dfQ== --9431149156168 Content-Disposition: form-data; name="Signature" kZoYNv66bsmc10+dcGKw5x2P**** --9431149156168 Content-Disposition: form-data; name="file"; filename="MyFilename.txt" Content-Type: text/plain abcdefg --9431149156168 Content-Disposition: form-data; name="submit" Upload to OSS --9431149156168--
返回樣本:
HTTP/1.1 200 OK x-oss-request-id: 61d2042d-1b68-6708-5906-33d81921362e Date: Fri, 24 Feb 2014 06:03:28 GMT ETag: "5B3C1A2E053D763E1B002CC607C5****" Connection: keep-alive Content-Length: 0 x-oss-hash-crc64ecma: 316181249502703**** Content-MD5: 1B2M2Y8AsgTpgAmY7PhC**** Server: AliyunOSS
錯誤碼
錯誤碼 | HTTP狀態代碼 | 描述 |
FieldItemTooLong | 400 | 表單域key的大小不允許超過8 KB,表單域value的大小不允許超過2 MB。 |
InvalidArgument | 400 | 無論Bucket是否為public-read-write,一旦上傳OSSAccessKeyId、policy、Signature表單域中的任意一個,則另兩個表單域為必選項。如果缺失,將返回此錯誤。 |
InvalidDigest | 400 | 使用者上傳了Content-MD5請求Header,OSS會計算body的Content-MD5並檢查一致性,如果不一致,將返回此錯誤。 |
EntityTooLarge | 400 | 請求的body總長度不允許超過5 GB。如果檔案長度過大,將返回此錯誤。 |
InvalidEncryptionAlgorithmError | 400 | 如果上傳時指定了x-oss-server-side-encryption Header請求域,則必須設定其值為AES256或KMS。如果設定為其他值,將返回此錯誤。 |
IncorrectNumberOfFilesInPOSTRequest | 400 | Post請求中檔案個數無效。Post請求中只能有一個file表單域。 |
FileAlreadyExists | 409 | 請求的Header中攜帶x-oss-forbid-overwrite=true時,表示禁止覆蓋同名檔案。如果檔案已存在,將返回此錯誤。 |
KmsServiceNotEnabled | 403 | 將x-oss-server-side-encryption指定為KMS,但沒有預先購買KMS套件。 |
FileImmutable | 409 | Bucket內的資料處於被保護狀態時,如果您嘗試刪除或修改這些資料,將返回此錯誤碼。 |
MethodNotAllowed | 405 | 用戶端使用的HTTP要求方法不被伺服器支援或允許。請檢查要求方法和要求標頭,確保要求標頭資訊正確且服務支援所使用的要求方法;檢查URL資訊,確保URL的正確性,包括協議、網域名稱、路徑等部分。 |
POST policy
policy表單域是一種安全性原則,用於定義通過HTML表單上傳檔案到OSS時的許可權限制和約束條件。policy表單域通過JSON格式定義,通過多項參數限制上傳操作,例如允許上傳的Bucket名稱、Object首碼、有效期間、允許的HTTP方法、上傳內容的大小限制、內容類型限制等。
關於POST請求V4簽名的policy詳細介紹,請參見POST請求V4簽名的policy
關於POST請求V1簽名的policy詳細介紹,請參見POST請求V1簽名的policy。
POST signature
POST signature是指在使用PostObject上傳方式時,為保證上傳請求的安全性,OSS要求每個上傳請求都攜帶一個簽名(Signature),用於確保上傳請求的合法性和安全性。
關於POST請求V4簽名的詳細介紹,請參見POST請求V4簽名。
關於POST請求V1簽名的詳細介紹,請參見POST請求V1簽名。
常見問題
報錯Your proposed upload exceeds the maximum allowed size.如何處理?
問題原因:上傳檔案的大小超出content-length-range指定的檔案大小範圍。
解決方案:content-length-range用於指定上傳檔案的最小和最大允許大小,單位為位元組。例如,您需要上傳的檔案大小為1 GB,則content-length-range可以設定為["content-length-range", 1, 1073741824]。
更多參考
關於Web端表單直傳OSS的樣本,請參見JavaScript用戶端簽名直傳。
關於調用PostObject介面的常見錯誤及解決方案,請參見PostObject常見錯誤及排查。