全部產品
Search
文件中心

Object Storage Service:PostObject

更新時間:Nov 12, 2024

調用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操作提交表單編碼必須為multipart/form-data,即Header中Content-Type為multipart/form-data;boundary=xxxxxx的形式。

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,或將x-oss-forbid-overwrite指定為false時,表示允許覆蓋同名Object。

  • 指定x-oss-forbid-overwritetrue時,表示禁止覆蓋同名Object;

設定x-oss-forbid-overwrite請求Header會導致QPS處理效能下降,如果您有大量的操作需要使用x-oss-forbid-overwrite要求標頭(QPS > 1000),請聯絡支援人員,避免影響您的業務。

x-oss-object-acl

字串

在檔案表單域中指定Object的存取權限。此項支援在檔案表單域中指定。

取值:

  • default(預設):Object遵循所在儲存空間的存取權限。

  • private:Object是私人資源。只有Object的擁有者和授權使用者有該Object的讀寫權限,其他使用者沒有許可權操作該Object。

  • public-read:Object是公用讀取資源。只有Object的擁有者和授權使用者有該Object的讀寫權限,其他使用者只有該Object的讀許可權。請謹慎使用該許可權。

  • public-read-write:Object是公用讀寫資源。所有使用者都有該Object的讀寫權限。請謹慎使用該許可權。

關於存取權限的更多資訊,請參見設定Object ACL

x-oss-storage-class

字串

指定Object的儲存類型。

對於任意儲存類型的Bucket,如果上傳Object時指定此參數,則此次上傳的Object將儲存為指定的類型。例如在IA類型的Bucket中上傳Object時,如果指定x-oss-storage-class為Standard,則該Object直接儲存為Standard。

取值:

  • Standard:標準儲存

  • IA:低頻訪問

  • Archive:Archive Storage

  • ColdArchive:冷Archive Storage

  • DeepColdArchive:深度冷Archive Storage

    重要

    如果要上傳的檔案數量較多,直接指定上傳的檔案類型為深度冷歸檔類型會造成較高的PUT類請求費用。建議您先將檔案的儲存類型指定為標準儲存進行上傳,然後通過生命週期規則將其轉儲為深度冷歸檔類型,從而降低PUT類請求費用。

關於更多資訊,請參見儲存類型介紹

key

字串

上傳Object的名稱,無需編碼。如果名稱包含路徑,例如destfolder/example.jpg,則OSS會自動建立相應的檔案夾。

預設值:無

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值。

預設值:無

如果請求中攜帶以x-oss-meta-為首碼的表單域,則視為user meta,例如x-oss-meta-location

說明

一個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內的資料處於被保護狀態時,如果您嘗試刪除或修改這些資料,將返回此錯誤碼。

POST policy

policy表單域是一種安全性原則,用於定義通過HTML表單上傳檔案到OSS時的許可權限制和約束條件。policy表單域通過JSON格式定義,通過多項參數限制上傳操作,例如允許上傳的Bucket名稱、Object首碼、有效期間、允許的HTTP方法、上傳內容的大小限制、內容類型限制等。

POST signature

POST signature是指在使用PostObject上傳方式時,為保證上傳請求的安全性,OSS要求每個上傳請求都攜帶一個簽名(Signature),用於確保上傳請求的合法性和安全性。

常見問題

報錯Your proposed upload exceeds the maximum allowed size.如何處理?

  • 問題原因:上傳檔案的大小超出content-length-range指定的檔案大小範圍。

  • 解決方案:content-length-range用於指定上傳檔案的最小和最大允許大小,單位為位元組。例如,您需要上傳的檔案大小為1 GB,則content-length-range可以設定為["content-length-range", 1, 1073741824]。

更多參考