POST操作使用HTML表單將文件上傳到指定的Bucket。POST是另一種形式的PUT操作,POST可以讓使用者通過Browser-based的方式,將文件上傳到指定Bucket中。PUT的參數是通過HTTP Header提交的,而POST通過使用multipart/form-data編碼的消息體中的字段進行提交。用戶必須對操作的Bucket有寫權限。OOS不存儲部分文件:如果收到成功的響應,那么文件就是存儲成功了。
為了保證數據在網絡傳輸過程中沒有損壞,可以使用Content-MD5字段進行校驗。如果請求參數中有Content-MD5,OOS將會計算用戶提交的文件的MD5值。如果計算出的值與用戶提供的值不一致,OOS將會返回一個錯誤給用戶。或者,用戶可以在上傳文件到OOS時計算文件的MD5值,并與OOS在響應中返回的ETag進行比較。ETag是文件內容的MD5值,不包括metadata。
請求語法
POST /HTTP/1.1
Host: BucketName.oos-cn.ctyunapi.cn
User-Agent: browser_data
Accept: file_types
Accept-Language: Regions
Accept-Encoding: encoding
Accept-Charset: character_set
Keep-Alive: 300
Connection: keep-alive
Content-Type: multipart/form-data; boundary=9431149156168
Content-Length: length
--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-Type"
content_type
--9431149156168
Content-Disposition: form-data; name="x-amz-meta-uuid"
uuid
--9431149156168
Content-Disposition: form-data; name="x-amz-meta-tag"
metadata
--9431149156168
Content-Disposition: form-data; name="AWSAccessKeyId"
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 OOS
--9431149156168—表單字段
說明
表單中指定的每個表單字段(AWSAccessKeyId、signature、x-amz-signature、file、policy和帶x-ignore-前綴的字段名稱除外)必須包含在policy條件列表中,兩者需要保持一致。
| 名稱 | 描述 | 是否必須 |
|---|---|---|
| AWSAccessKeyId | 根用戶或擁有權限的子用戶的訪問密鑰ID。如果請求包含policy,對于V2簽名,則此字段為必填字段。 類型:字符串。 | 條件 |
Cache-Control, Content-Type, Content-Disposition, Content-Encoding, Expires | 特定于REST的請求頭。有關更多信息,請參閱PUT Object。 類型:字符串。 | 否 |
| file | 文件或文本內容。文件或文本內容必須是Form表單的最后一個字段。一次只能上傳一個文件。 類型:文件或文本內容。 | 是 |
| key | 上傳文件的名稱。 ${filename}為用戶提供的文件名。例如,如果用戶Betty上傳的文件名為lolcatz.jpg, 字段值指定為/user/betty/${filename},那么保存的文件名稱將會是/user/betty/lolcatz.jpg。 類型:字符串 | 是 |
| policy | 描述請求中允許的內容的安全策略。對于非匿名請求,policy字段是必須的。 在V2或者V4簽名計算中,policy字段是您簽名的字符串。 類型:字符串。 | 條件 |
| signature | 使用V2簽名計算的簽名。如果請求包含policy,對于V2簽名,則此字段為必填字段。 signature = Base64(HMAC-SHA1(YourSecrectKey,StringToSign))。 | 條件 |
| X-Amz-Algorithm | V4簽名算法。如果請求包含policy,對于V4簽名,則此字段為必填字段。 取值:AWS4-HMAC-SHA256。 | 條件 |
| X-Amz-Credential | 用戶的accessKeyId和范圍信息,范圍信息包括請求日期、區域、服務、終止字符串aws4_request,格式如下: <your-access-key-id>/<date>/<region>/<service>/aws4_request 其中:
如果請求包含policy,對于V4簽名,則此字段為必填字段。 | 條件 |
| X-Amz-Date | 日期和時間格式必須遵循ISO 8601標準,并且必須使用“yyyyMMddT HHmmssZ”格式進行格式化。例如,如果日期和時間是“08/01/2018 15:32:41.982-700”,則必須首先將其轉換為UTC(協調世界時),然后提交為“20180801T083241Z”。 如果請求包含policy,對于V4簽名,則此字段為必填字段。 | 條件 |
| X-Amz-Signature | 使用V4簽名計算的簽名。如果請求包含policy,對于V4簽名,則此字段為必填字段。 x-amz-signature=hex(HMAC-SHA256(SigningKey, StringToSign))。 | 條件 |
| X-Amz-security-token | 臨時會話使用的安全令牌。使用臨時密鑰構造V2或者V4簽名請求時,此字段為必填字段。 | 條件 |
| success_action_redirect,redirect | 上傳成功后客戶端重定向到的URL。OOS將Bucket、文件名和etag值作為查詢字符串參數附加到URL。
類型:字符串。 注意 redirect后續可能會被移除,建議使用success_action_redirect。 | 否 |
| success_action_status | 如果沒有指定success_action_redirect,上傳成功后狀態代碼將返回到客戶端。 取值:200、201或204(默認)。
注意 某些版本的AdobeFlashplayer無法正確處理使用空白正文的HTTP響應。要通過AdobeFlash支持上傳,建議您將success_action_status設置為201。 | 否 |
| x-amz-storage-class | 數據的存儲類型。 類型:字符串。 取值:
默認值為STANDARD。 | 否 |
| x-amz-meta-* | 任何頭以這個前綴開始都會被認為是用戶的元數據,當用戶檢索時,它將會和文件一起被存儲并返回。更多信息請參考PUT Object 類型:字符串。 | 否 |
| x-amz-website-redirect-location | 如果Bucket配置為網站,重定向對這個文件的請求到相同Bucket的另外一個文件或者到一個其他的URL。OOS會保存這個值到文件的metadata。 下面這個例子表示請求頭設置重定向到相同Bucket的另一個文件(anotherPage.html)。 x-amz-website-redirect-location: /anotherPage.html 重定向到其他網站的例子: x-amz-website-redirect-location: //example-bucket.oos-cn.ctyunapi.cn。 注意 這個值必須以“/”、//或//開頭,且長度不能超過2KiB。 | 否 |
| x-ctyun-data-location | 設置數據存儲的位置。 注意 香港節點不支持此參數。 類型:key-value形式。 取值: 格式為:type=Local,scheduleStrategy=scheduleStrategy或者type=Specified,location=location,scheduleStrategy=scheduleStrategy
| 否 |
響應頭
除了通用的響應頭以外,本操作可以包括以下響應頭。
| 名稱 | 描述 |
|---|---|
| x-amz-expiration | 如果文件設置了過期時間(參考PUT Bucket Lifecycle章節),響應頭會增加過期信息。過期信息包括過期日期和rule-id的key和value。rule-id的value是經過URL編碼的。 類型:字符串。 |
| success_action_redirect, redirect | 上傳成功重定向的URL。 類型:字符串。 |
響應結果
| 名稱 | 描述 |
|---|---|
| Bucket | 存儲Object的Bucket名稱。 類型:字符串。 父元素:PostResponse。 |
| ETag | ETag是文件內容經過MD5哈希后得到的值。用戶可以在GET請求中使用If-Match請求頭。ETag僅反映文件內容的變化,不包括元數據。 類型:字符串。 父元素:PostResponse。 |
| Key | 文件名稱。 類型:字符串。 父元素:PostResponse。 |
| Location | 文件的URL。 類型:字符串。 父元素: PostResponse。 |
請求示例1
使用V4簽名:
POST / HTTP/1.1
Content-Type: multipart/form-data; boundary=jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR; charset=UTF-8
Host: a--12.oos-cn.ctyunapi.cn
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.7 (Java/1.8.0_351)
Content-Length: 1387
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR
Content-Disposition: form-data; name="x-amz-algorithm"
AWS4-HMAC-SHA256
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR
Content-Disposition: form-data; name="X-Amz-Credential"
25e67be754a9b2c85870/20240523/cn/s3/aws4_request
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR
Content-Disposition: form-data; name="x-amz-date"
20240523T092508Z
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR
Content-Disposition: form-data; name="key"
test01-post
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR
Content-Disposition: form-data; name="policy"
eyJleHBpcmF0aW9uIjoiMjAyNC0xMi0wMVQxMjowMDowMC4wMDBaIiwiY29uZGl0aW9ucyI6W3siYnVja2V0IjoiYS0tMTIifSx7ImtleSI6InRlc3QwMS1wb3N0In0seyJ4LWFtei1hbGdvcml0aG0iOiJBV1M0LUhNQUMtU0hBMjU2In0seyJ4LWFtei1jcmVkZW50aWFsIjoiMjVlNjdiZTc1NGE5YjJjODU4NzAvMjAyNDA1MjMvY24vczMvYXdzNF9yZXF1ZXN0In0seyJ4LWFtei1kYXRlIjoiMjAyNDA1MjNUMDkyNTA4WiJ9XX0=
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR
Content-Disposition: form-data; name="x-amz-signature"
91a935c2c409851f810cff5db53edb24415292edd651292de67432bc672169d7
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR
Content-Disposition: form-data; name="file"; filename="test01-post"
Content-Type: text/plain; charset=UTF-8
hello world!12345!@#$%^&*()_+":[]\?>,.adsf
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR
Content-Disposition: form-data; name="submit"
upload to oos
--jOgLwKAuIgki-MzA2jxfztAlGcp-wO0rfdR--響應示例1
HTTP/1.1 204 No Content
ETag: "85c974a5ac9c67c64f55dba5d7c803a1"
Date: Thu, 23 May 2024 01:25:08 GMT
x-amz-request-id: c0e2170effd74bba0b7e71807582848a494b513f4143454749
Location: //a--12.oos-cn.ctyunapi.cn/test01-post
Server: CTYUN請求示例2
使用V2簽名:
POST / HTTP/1.1
Content-Type: multipart/form-data; boundary=Ov8XWNyC3VX8y9lKZ4KPHJvpsN8TfDNqN5l; charset=UTF-8
Host: a--12.oos-cn.ctyunapi.cn
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.7 (Java/1.8.0_351)
Accept-Encoding: gzip,deflate
Content-Length: 841
--Ov8XWNyC3VX8y9lKZ4KPHJvpsN8TfDNqN5l
Content-Disposition: form-data; name="AWSAccessKeyId"
25e67be754a9b2c85870
--Ov8XWNyC3VX8y9lKZ4KPHJvpsN8TfDNqN5l
Content-Disposition: form-data; name="key"
1.post
--Ov8XWNyC3VX8y9lKZ4KPHJvpsN8TfDNqN5l
Content-Disposition: form-data; name="policy"
eyJleHBpcmF0aW9uIjoiMjAyNS0xMS0zMVQxMjowMDowMC4wMDBaIiwiY29uZGl0aW9ucyI6W3siYnVja2V0IjoiYS0tMTIifSx7ImtleSI6IjEucG9zdCJ9XX0=
--Ov8XWNyC3VX8y9lKZ4KPHJvpsN8TfDNqN5l
Content-Disposition: form-data; name="signature"
R0y00Fj0FoIFFSuXQvo0i52Gd0Y=
--Ov8XWNyC3VX8y9lKZ4KPHJvpsN8TfDNqN5l
Content-Disposition: form-data; name="file"; filename="1.post"
Content-Type: image/jpeg; charset=UTF-8
123
--Ov8XWNyC3VX8y9lKZ4KPHJvpsN8TfDNqN5l
Content-Disposition: form-data; name="submit"
upload to oos
--Ov8XWNyC3VX8y9lKZ4KPHJvpsN8TfDNqN5l--響應示例2
HTTP/1.1 204 No Content
ETag: "202cb962ac59075b964b07152d234b70"
Date: Thu, 23 May 2024 02:27:01 GMT
x-amz-request-id: 9d721961d2b14a5a0a7d707f74818389484a543e4042444648
Location: //a--12.oos-cn.ctyunapi.cn/1.post
Server: CTYUN說明
表單聲明包含三個部分:action、method和enctype。如果這些值當中的任意一個設置不正確,請求將失敗。action指定處理請求的URL,必須將它設置為Bucket的URL。例如:Bucket的名稱是BucketName,則URL為//BucketName.oos-cn.ctyunapi.cn/。
<form action="// BucketName.oos-cn.ctyunapi.cn /" method="post" enctype="multipart/form-data">
</form>Post Policy字段的構造
Policy是使用UTF-8和Base64編碼的JSON文檔,即需要對源碼進行轉換:先確保源碼符合UTF-8編碼格式,然后再進行Base-64編碼。它指定了請求必須滿足的條件并且用于對內容進行身份驗證。根據您設計策略文檔的方式,您可以對每次上傳、每個用戶、所有上傳或根據其他能夠滿足您需要的設計來使用它們。
下面是一個簡單的Post Policy示例:
Policy源碼由過期(expiration)和條件(conditions)兩部分構成,且符合UTF-8編碼格式(如果不符合UTF-8編碼格式,需要轉換成符合UTF-8編碼格式的編碼):
{ "expiration": "2007-12-01T12:00:00.000Z", "conditions": [ { "bucket": "johnsmith" }, [ "starts-with", "$key", "user/eric/" ] ] }對源碼進行Base64編碼。
ewogICAgImV4cGlyYXRpb24iOiAiMjAwNy0xMi0wMVQxMjowMDowMC4wMDBaIiwKICAgICJjb25kaXRpb25zIjogWwogICAgICAgIHsKICAgICAgICAgICAgImJ1Y2tldCI6ICJqb2huc21pdGgiCiAgICAgICAgfSwKICAgICAgICBbCiAgICAgICAgICAgICJzdGFydHMtd2l0aCIsCiAgICAgICAgICAgICIka2V5IiwKICAgICAgICAgICAgInVzZXIvZXJpYy8iCiAgICAgICAgXQogICAgXQp9過期
過期元素采用ISO 8601UTC日期格式來指定策略的過期日期。例如,“2007-12-01T12:00:00.000Z”指定策略在2007年12月1日午夜UTC之后失效。在策略文檔中過期字段是必需的。
條件
策略文檔中的條件驗證上傳的文件的內容。表單中指定的每個表單字段(AWSAccessKeyId、signature、X-Amz-signature、file、policy和帶x-ignore-前綴的字段名稱除外)必須包含在policy條件列表中,兩者需要保持一致。如果您有多個具有相同名稱的字段,使用逗號進行分隔。例如,如果您有兩個名為x- amz-meta-tag的字段,第一個字段的值為Ninja,第二個字段的值為Stallman,您可以將策略文檔設置為Ninja,Stallman。
針對擴展的字段執行前綴匹配。例如,如果您將文件名稱字段設置為user/betty/${filename},您的策略可能是["starts-with", "$key", "user/betty/" ]。請勿輸入["starts-with", "$key", "user/betty/${filename}"]。
| 元素名稱 | 說明 |
|---|---|
| X-Amz-Algorithm | V4簽名算法。如果請求包含policy,對于V4簽名,則此字段為必填字段。 取值:AWS4-HMAC-SHA256。 |
| X-Amz-Credential | 用戶的accessKeyId和范圍信息,范圍信息包括請求日期、區域、服務、終止字符串aws4_request,格式如下: <your-access-key-id>/<date>/<region>/<service>/aws4_request 其中:
如果請求包含policy,對于V4簽名,則此字段為必填字段。 |
| X-Amz-Date | 日期和時間格式必須遵循ISO 8601標準,并且必須使用“yyyyMMddT HHmmssZ”格式進行格式化。例如,如果日期和時間是“08/01/2018 15:32:41.982-700”,則必須首先將其轉換為UTC(協調世界時),然后提交為“20180801T083241Z”。 如果請求包含policy,對于V4簽名,則此字段為必填字段。 |
| X-Amz-Security-Token | 臨時會話使用的安全令牌。使用臨時密鑰構造V2或者V4簽名請求時,此字段為必填字段。 |
| x-amz-* | 以x-amz-開頭的系統定義的元數據。(如x-amz-website-redirect-location、x-amz-storage-class,不含x-amz-signature)。 支持精確匹配。 |
| bucket | 指定上傳內容允許的Bucket。 支持精確匹配和starts-with。 |
| content-length-range | 指定已上傳內容允許長度的最小值和最大值。 支持范圍匹配。 |
| Cache-Control, Content-Type, Content-Disposition, Content- Encoding, Expires | 特定于 REST 的標頭。 支持精確匹配和starts-with。 |
| Key | 已上傳文件的名稱或文件名稱前綴。 支持精確匹配和 starts-with。 |
| success_action_redirect, redirect | 上傳成功后客戶端重定向到的URL。 支持精確匹配和starts-with。 |
| success_action_status | 如果沒有指定 success_action_redirect,上傳成功后狀態代碼將返回到客戶端。 支持精確匹配。 |
| x-amz-meta- * | 特定于用戶的元數據。 支持精確匹配和 starts-with。 |
注意
如果您的工具包添加了其他字段(例如,Flash添加了文件名),您必須將它們添加到策略文檔。如果您可以控制此功能,將 x-ignore- 添加為字段的前綴以使OOS忽略此功能并使其不影響此功能的未來版本。
條件匹配
下表介紹條件匹配類型。盡管您必須為您在表單中指定的每個表單字段指定一個條件,您也可以通過為某個表單字段指定多個條件來創建更復雜的匹配條件。
| 條件 | 說明 |
|---|---|
| 精確匹配 | 精確匹配將驗證字段是否匹配特定的值。此示例指示Bucket必須設置為BucketName: {"bucket": "BucketName"} 也可寫為: [ "eq", "bucket": "BucketName"] |
| Starts With | 如果值必須從某個特定的值開始,請使用starts-with。本示例指示密鑰必須從 user/betty 開始: ["starts-with", "$key", "user/betty/"] |
| 匹配任何內容 | 要配置策略以允許字段中的任何內容,請使用 starts-with 和一個空值。本示例允許任何 success_action_redirect: ["starts-with", "$success_action_redirect", ""] |
| 指定范圍 | 對于接受范圍的字段,請使用逗號來分隔上限和下限值。本示例允許1到10 MiB 的文件大小: ["content-length-range", 1048579, 10485760] |
字符串轉義
| 轉義序列 | 描述 |
|---|---|
| \ | 反斜杠。 |
| $ | 美元符號。 |
| \b | 退格鍵。 |
| \f | 換頁。 |
| \n | 新建行。 |
| \r | 回車。 |
| \t | 水平選項卡。 |
| \v | 垂直選項卡。 |
| \uxxxx | 所有Unicode 字符。 |
Signature字段的構造步驟
使用UTF-8對policy內容進行編碼。
使用Base64對步驟1中的UTF-8字節進行編碼,得出簽名字符串(StringTosign)。
使用HMAC SHA-1算法,對步驟2中的簽名字符串和您的秘密訪問密鑰進行計算得出簽名:HMAC-SHA1(SecretAccessKey,StringToSign)。
使用Base64對SHA-1簽名進行編碼:Signature=Base64(HMAC-SHA1(SecretAccessKey,StringToSign))。
X-Amz-Signature字段的構造步驟
使用UTF-8對policy內容進行編碼。
使用Base64對這些UTF-8字節進行編碼,得出簽名字符串(StringTosign)。
推算出簽名用的密鑰(SigningKey)。推算過程:
使用HMAC SHA256算法,對步驟2和步驟3中的簽名字符串和簽名密鑰進行計算得出簽名。
使用十六進制編碼對簽名進行編碼:X-Amz-Signature=hex(HMAC-SHA256(SigningKey, StringToSign))。