

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# HTML 表單 (AWS 簽章版本 2)
<a name="HTTPPOSTForms"></a>

**Topics**
+ [HTML 表單編碼](#HTTPPOSTFormEncoding)
+ [HTML 表單宣告](#HTTPPOSTFormDeclaration)
+ [HTML 表單欄位](#HTTPPOSTFormFields)
+ [政策建構](#HTTPPOSTConstructPolicy)
+ [建構簽章](#HTTPPOSTConstructingPolicySignature)
+ [重新導向](#HTTPPOSTConstructingPolicyRedirection)

當您與 Amazon S3 通訊時，您通常會使用 REST 或 SOAP API 來執行放置、取得、刪除及其他作業。使用 POST 時，使用者經由瀏覽器直接將資料上傳至 Amazon S3，因此無法處理 SOAP API 或建立 REST `PUT` 請求。

**注意**  
 Amazon S3 的 SOAP API 不適用於新客戶，並且將於 2025 年 8 月 31 日接近生命週期結束 (EOL)。我們建議您使用 REST API 或 AWS SDKs。

若要允許使用者使用瀏覽器將內容上傳至 Amazon S3，您可以使用 HTML 表單。HTML 表單是由一個表單宣告與多個表單欄位所組成。表單宣告包含要求的高階資訊。表單欄位包含要求的詳細資訊，以及用來對要求進行身分驗證及確保其符合所指定條件的政策。

**注意**  
表單資料與邊界 (檔案內容除外) 不得超過 20 KB。

本節說明如何使用 HTML 表單。

## HTML 表單編碼
<a name="HTTPPOSTFormEncoding"></a>

表單與政策必須經過 UTF-8 編碼。您可以在 HTML 標題中指定 UTF-8 編碼，或將它指定作為要求標頭來套用至表單。

**注意**  
 HTML 表單宣告不接受查詢字串身分驗證參數。

以下為 HTML 標題中的 UTF-8 編碼範例：

```
1. <html>
2.   <head>
3.     ...
4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5.     ...
6.   </head>
7.   <body>
```

以下為要求標頭中的 UTF-8 編碼範例：

```
1. Content-Type: text/html; charset=UTF-8
```

## HTML 表單宣告
<a name="HTTPPOSTFormDeclaration"></a>

表單宣告有三個元件：動作、方法與封閉類型。若有任何值未正確設定，要求會失敗。

動作指定處理要求的 URL，必須將它設定為儲存貯體的 URL。例如，如果儲存貯體的名稱是 `awsexamplebucket1`，而區域是美國西部 (加利佛尼亞北部)，則 URL 為 `https://awsexamplebucket1.s3.us-west-1.amazonaws.com/`。

**注意**  
金鑰名稱是在表單欄位中指定。

方法必須是 POST。

封閉類型 (enctype) 必須加以指定，而且針對檔案上傳與文字區域上傳都必須設定為 multipart/form-data。如需詳細資訊，請參閱 [RFC 1867](http://www.ietf.org/rfc/rfc1867.txt)。

**Example**  
下列範例是儲存貯體 "awsexamplebucket1" 的表單宣告。  

```
1. <form action="https://awsexamplebucket1.s3.us-west-1.amazonaws.com/" method="post"
2. 
3. enctype="multipart/form-data">
```

## HTML 表單欄位
<a name="HTTPPOSTFormFields"></a>

下表說明可在 HTML 表單中使用的欄位。

**注意**  
系統會自動以使用者提供的檔案名稱來取代變數 `${filename}`，所有表單欄位都可識別此變數。如果瀏覽器或用戶端提供檔案的完整或部分路徑，則只會使用最後一個正斜線 (/) 或反斜線 (\\) 後面的文字。例如，"C:\\Program Files\\directory1\\file.txt" 會解譯為 "file.txt"。若未提供檔案或檔案名稱，則會以空字串取代變數。


| 欄位名稱 | 描述 | 必要 | 
| --- | --- | --- | 
| AWSAccessKeyId | 儲存貯體擁有者的 AWS 存取金鑰 ID，其會針對滿足政策中一組限制的請求授予匿名使用者存取。如果要求包含政策文件，則需要此欄位。 | 有條件 | 
| acl | Amazon S3 存取控制清單 (ACL)。如果指定了無效的存取控制清單，則會產生錯誤。<br />類型：字串<br />預設值：private<br /> 有效值: `private \| public-read \| public-read-write \| aws-exec-read \| authenticated-read \| bucket-owner-read \| bucket-owner-full-control `  | 否 | 
| Cache-Control, Content-Type, Content-Disposition, Content-Encoding, Expires | REST 特定標頭。如需詳細資訊，請參閱 [PUT 物件](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)。 | 否 | 
| key | 上傳的金鑰名稱。<br />若要使用使用者提供的檔名，請使用 ${filename} 變數。例如，如果使用者 Betty 上傳檔案 lolcatz.jpg 且您指定 /user/betty/${filename}，則檔案會另存為 /user/betty/lolcatz.jpg。<br />如需詳細資訊，請參閱[使用物件中繼資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html)。 | 是 | 
| policy | 說明要求中所允許之內容的安全政策。未使用安全政策的要求會視為匿名，只有在可公開寫入的儲存貯體上才會成功。 | 否 | 
| success\_action\_redirect, redirect | 用戶端成功上傳時被重新導向的目標 URL。Amazon S3 會將 bucket、key 和 etag 值當作查詢字串參數附加至 URL。<br />若未指定 success\_action\_redirect，Amazon S3 會傳回 success\_action\_status 欄位中所指定的空白文件類型。<br />如果 Amazon S3 無法解譯 URL，則會忽略 欄位。<br />如果上傳失敗，Amazon S3 會顯示錯誤，而不會將使用者重新導向至 URL。<br />如需詳細資訊，請參閱[重新導向](#HTTPPOSTConstructingPolicyRedirection)。  redirect 欄位名稱已被取代，未來將會移除對 redirect 欄位名稱的支援。  | 否 | 
| success\_action\_status | 成功上傳時，傳回給用戶端的狀態碼 (若未指定 success\_action\_redirect)。<br />有效值為 200、201 或 204 (預設值)。<br />如果值設定為 200 或 204，Amazon S3 會傳回狀態碼為 200 或 204 的空白文件。<br />如果值設定為 201，Amazon S3 會傳回狀態碼為 201 的 XML 文件。如需 XML 文件內容的相關資訊，請參閱 [POST 物件](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)。<br />如果值未設定或設定為無效的值，Amazon S3 會傳回狀態碼為 204 的空白文件。 Adobe Flash Player 的某些版本無法正確處理具有空白主體的 HTTP 回應。若要支援經由 Adobe Flash 上傳，建議將 `success_action_status` 設定為 201。  | 否 | 
| signature | HMAC 簽章是使用對應至提供之 AWSAccessKeyId 的私密存取金鑰所建構。如果要求包含政策文件，則需要此欄位。<br />如需詳細資訊，請參閱 [Amazon S3 的 Identity and Access Management](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-iam.html)。 | 有條件 | 
| x-amz-security-token | 工作階段登入資料所使用的安全字符<br /> 如果請求使用 Amazon DevPay，則需要兩個 `x-amz-security-token` 表單欄位：一個表示產品字符，另一個表示使用者字符。<br />如果要求使用工作階段登入資料，則需要一個 `x-amz-security-token` 表單。如需詳細資訊，請參閱*《IAM 使用者指南》*中的[臨時安全登入資料](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)。<br /> | 否 | 
| 前面加上 x-amz-meta- 的其他欄位名稱 | 使用者指定的中繼資料。<br />Amazon S3 不會驗證或使用此資料。<br />如需詳細資訊，請參閱 [PUT 物件](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)。 | 否 | 
| file | 檔案或文字內容。<br />檔案或內容必須是表單中的最後一個欄位。其下方的任何欄位都會被忽略。<br />您無法一次上傳多個檔案。 | 是 | 

## 政策建構
<a name="HTTPPOSTConstructPolicy"></a>

**Topics**
+ [Expiration](#HTTPPOSTExpiration)
+ [條件](#PolicyConditions)
+ [條件比對](#ConditionMatching)
+ [字元逸出](#HTTPPOSTEscaping)

政策是 UTF-8 與 Base64 編碼的 JSON 文件，其指定要求必須符合的條件，並用來對內容進行身分驗證。根據您設計政策文件的方式，您可以針對每次上傳、每位使用者、所有上傳，或根據符合您需求的其他設計來使用這些文件。

**注意**  
 雖然您不一定要使用政策文件，但強烈建議在將儲存貯體設為可公開寫入時使用它。

以下為政策文件的範例：

```
 1. { "expiration": "2007-12-01T12:00:00.000Z",
 2. 
 3.   "conditions": [
 4. 
 5.     {"acl": "public-read" },
 6. 
 7.     {"bucket": "awsexamplebucket1" },
 8. 
 9.     ["starts-with", "$key", "user/eric/"],
10. 
11.   ]
12. 
13. }
```

政策文件包含過期與條件。

### Expiration
<a name="HTTPPOSTExpiration"></a>

過期元素是以 ISO 8601 UTC 日期格式來指定政策的過期日期。例如，"2007-12-01T12:00:00.000Z" 指定政策在過了 2007-12-01 午夜 UTC 後無效。政策中需要有過期資訊。

### 條件
<a name="PolicyConditions"></a>

政策文件中的條件會驗證上傳的物件內容。您在表單中指定的每個表單欄位 (AWSAccessKeyId、簽章、檔案、政策與具有 x-ignore- 字首的欄位名稱除外) 必須包含在條件清單中。

**注意**  
如果您有多個同名的欄位，則必須以逗號分隔其值。例如，如果您有名為 "x-amz-meta-tag" 的兩個欄位，且第一個欄位的值為 "Ninja"，第二個欄位的值為 "Stallman"，您會將政策文件設定為 `Ninja,Stallman`。  
 系統會展開表單中的所有變數，再驗證政策。因此，必須對展開的欄位執行所有條件比對。例如，如果將金鑰欄位設定為 `user/betty/${filename}`，您的政策可能是 `[ "starts-with", "$key", "user/betty/" ]`。請勿輸入 `[ "starts-with", "$key", "user/betty/${filename}" ]`。如需詳細資訊，請參閱「[條件比對](#ConditionMatching)」。

下表說明政策文件條件。


| 元素名稱 | 描述 | 
| --- | --- | 
| acl | 指定 ACL 必須符合的條件。<br />支援完全符合與 `starts-with`。 | 
| content-length-range | 指定上傳內容允許的大小上下限。<br />支援範圍比對。 | 
| Cache-Control、Content-Type、Content-Disposition、Content-Encoding、Expires | REST 特定標頭。<br />支援完全符合與 `starts-with`。 | 
| 金鑰 | 上傳的金鑰名稱。<br />支援完全符合與 `starts-with`。 | 
| success\_action\_redirect、redirect  | 用戶端成功上傳時被重新導向的目標 URL。<br />支援完全符合與 `starts-with`。 | 
| success\_action\_status | 成功上傳時，傳回給用戶端的狀態碼 (若未指定 success\_action\_redirect)。<br />支援完全符合。 | 
| x-amz-security-token | Amazon DevPay 安全字符。<br />每個使用 Amazon DevPay 的請求都需要兩個 `x-amz-security-token` 表單欄位：一個表示產品字符，另一個表示使用者字符。因此，必須以逗號分隔其值。例如，如果使用者字符為 `eW91dHViZQ==`，而產品字符為 `b0hnNVNKWVJIQTA=`，您會將政策項目設定為：`{ "x-amz-security-token": "eW91dHViZQ==,b0hnNVNKWVJIQTA=" }`。 | 
| 前面加上 x-amz-meta- 的其他欄位名稱 | 使用者指定的中繼資料。<br />支援完全符合與 `starts-with`。 | 

**注意**  
 如果您的工具組新增其他欄位 (例如 Flash 新增檔案名稱)，則必須將它新增至政策文件。如果您可以控制此功能，請在欄位前面加上 `x-ignore-`，讓 Amazon S3 忽略此功能，這不會影響此功能的未來版本。

### 條件比對
<a name="ConditionMatching"></a>

下表說明條件比對類型。雖然您必須針對表單中所指定的每個表單欄位指定一個條件，但您可以藉由針對表單欄位指定多個條件，來建立更複雜的符合條件。


|  Condition  |  描述  | 
| --- | --- | 
| 完全符合 | 完全符合會確認欄位符合特定值。下列範例表示 ACL 必須設定為 public-read：<pre>{"acl": "public-read" }</pre><br />您也可以使用下列範例來表示 ACL 必須設定為 public-read：<pre>[ "eq", "$acl", "public-read" ]</pre> | 
| 開頭為 | 如果值必須以特定值開頭，請使用 starts-with。下列範例表示金鑰必須以 user/betty 開頭：<pre>["starts-with", "$key", "user/betty/"]</pre> | 
| 符合任何內容 | 若要設定政策以允許欄位中的任何內容，請使用 starts-with 並提供空白值。下列範例允許任何 success\_action\_redirect：<pre>["starts-with", "$success_action_redirect", ""]</pre> | 
| 指定範圍 | 針對接受範圍的欄位，請以逗號分隔範圍的上下限。下列範例允許 1 到 10 MB 的檔案大小：<pre>["content-length-range", 1048579, 10485760]</pre> | 

### 字元逸出
<a name="HTTPPOSTEscaping"></a>

下表說明政策文件中必須逸出的字元。


|  逸出序列  |  描述  | 
| --- | --- | 
| \\\\ | 反斜線 | 
| \\$ | 貨幣符號 | 
| \\b | 退格鍵 | 
| \\f | Form Feed | 
| \\n | 新行 | 
| \\r | 歸位字元 | 
| \\t | 水平標籤 | 
| \\v | 垂直標籤 | 
| \\u{{xxxx}} | 所有 Unicode 字元 | 

## 建構簽章
<a name="HTTPPOSTConstructingPolicySignature"></a>


| 步驟 | 描述 | 
| --- | --- | 
| 1 | 使用 UTF-8 進行政策的編碼。 | 
| 2 | 使用 Base64 進行這些 UTF-8 位元組的編碼。 | 
| 3 | 使用 HMAC SHA-1 透過私密存取金鑰簽署政策。 | 
| 4 | 使用 Base64 進行 SHA-1 簽章的編碼。 | 

如需身分驗證的一般資訊，請參閱 [Amazon S3 的 Identity and Access Management](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-iam.html)。

## 重新導向
<a name="HTTPPOSTConstructingPolicyRedirection"></a>

本節說明如何處理重新導向。

### 一般重新導向
<a name="HTTPPOSTGeneralRedirection"></a>

完成 POST 要求後，使用者會被重新導向至您在 `success_action_redirect` 欄位中指定的位置。如果 Amazon S3 無法解譯 URL，則會忽略 `success_action_redirect` 欄位。

若未指定 `success_action_redirect`，Amazon S3 會傳回 `success_action_status` 欄位中所指定的空白文件類型。

如果 POST 請求失敗，Amazon S3 會顯示錯誤，而不會提供重新導向。

### 上傳前重新導向
<a name="HTTPPOSTPreUpload"></a>

如果您的儲存貯體是使用 <CreateBucketConfiguration> 所建立，您的最終使用者可能需要重新導向。如果發生此情況，某些瀏覽器可能無法正確處理重新導向。這是相當少見的情況，最可能在建立儲存貯體之後立即發生。