View a markdown version of this page

HTML 表單 (AWS 簽章版本 2) - Amazon Simple Storage Service

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

HTML 表單 (AWS 簽章版本 2)

當您與 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 表單編碼

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

注意

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

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

<html> <head> ... <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> ... </head> <body>

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

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

HTML 表單宣告

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

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

注意

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

方法必須是 POST。

封閉類型 (enctype) 必須加以指定,而且針對檔案上傳與文字區域上傳都必須設定為 multipart/form-data。如需詳細資訊,請參閱 RFC 1867

範例

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

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

HTML 表單欄位

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

注意

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

欄位名稱 描述 必要
AWSAccessKeyId

儲存貯體擁有者的 AWS 存取金鑰 ID,其會針對滿足政策中一組限制的請求授予匿名使用者存取。如果要求包含政策文件,則需要此欄位。

有條件

acl

Amazon S3 存取控制清單 (ACL)。如果指定了無效的存取控制清單,則會產生錯誤。

類型:字串

預設值:private

有效值: 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 物件

key

上傳的金鑰名稱。

若要使用使用者提供的檔名,請使用 ${filename} 變數。例如,如果使用者 Betty 上傳檔案 lolcatz.jpg 且您指定 /user/betty/${filename},則檔案會另存為 /user/betty/lolcatz.jpg。

如需詳細資訊,請參閱使用物件中繼資料

policy

說明要求中所允許之內容的安全政策。未使用安全政策的要求會視為匿名,只有在可公開寫入的儲存貯體上才會成功。

success_action_redirect, redirect

用戶端成功上傳時被重新導向的目標 URL。Amazon S3 會將 bucket、key 和 etag 值當作查詢字串參數附加至 URL。

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

如果 Amazon S3 無法解譯 URL,則會忽略 欄位。

如果上傳失敗,Amazon S3 會顯示錯誤,而不會將使用者重新導向至 URL。

如需詳細資訊,請參閱重新導向

注意

redirect 欄位名稱已被取代,未來將會移除對 redirect 欄位名稱的支援。

success_action_status

成功上傳時,傳回給用戶端的狀態碼 (若未指定 success_action_redirect)。

有效值為 200、201 或 204 (預設值)。

如果值設定為 200 或 204,Amazon S3 會傳回狀態碼為 200 或 204 的空白文件。

如果值設定為 201,Amazon S3 會傳回狀態碼為 201 的 XML 文件。如需 XML 文件內容的相關資訊,請參閱 POST 物件

如果值未設定或設定為無效的值,Amazon S3 會傳回狀態碼為 204 的空白文件。

注意

Adobe Flash Player 的某些版本無法正確處理具有空白主體的 HTTP 回應。若要支援經由 Adobe Flash 上傳,建議將 success_action_status 設定為 201。

signature

HMAC 簽章是使用對應至提供之 AWSAccessKeyId 的私密存取金鑰所建構。如果要求包含政策文件,則需要此欄位。

如需詳細資訊,請參閱 Amazon S3 的 Identity and Access Management

有條件

x-amz-security-token

工作階段登入資料所使用的安全字符

如果請求使用 Amazon DevPay,則需要兩個 x-amz-security-token 表單欄位:一個表示產品字符,另一個表示使用者字符。

如果要求使用工作階段登入資料,則需要一個 x-amz-security-token 表單。如需詳細資訊,請參閱《IAM 使用者指南》中的臨時安全登入資料

前面加上 x-amz-meta- 的其他欄位名稱

使用者指定的中繼資料。

Amazon S3 不會驗證或使用此資料。

如需詳細資訊,請參閱 PUT 物件

file

檔案或文字內容。

檔案或內容必須是表單中的最後一個欄位。其下方的任何欄位都會被忽略。

您無法一次上傳多個檔案。

政策建構

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

注意

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

以下為政策文件的範例:

{ "expiration": "2007-12-01T12:00:00.000Z", "conditions": [ {"acl": "public-read" }, {"bucket": "awsexamplebucket1" }, ["starts-with", "$key", "user/eric/"], ] }

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

Expiration

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

條件

政策文件中的條件會驗證上傳的物件內容。您在表單中指定的每個表單欄位 (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}" ]。如需詳細資訊,請參閱「條件比對」。

下表說明政策文件條件。

元素名稱 描述
acl

指定 ACL 必須符合的條件。

支援完全符合與 starts-with

content-length-range

指定上傳內容允許的大小上下限。

支援範圍比對。

Cache-Control、Content-Type、Content-Disposition、Content-Encoding、Expires

REST 特定標頭。

支援完全符合與 starts-with

金鑰

上傳的金鑰名稱。

支援完全符合與 starts-with

success_action_redirect、redirect

用戶端成功上傳時被重新導向的目標 URL。

支援完全符合與 starts-with

success_action_status

成功上傳時,傳回給用戶端的狀態碼 (若未指定 success_action_redirect)。

支援完全符合。

x-amz-security-token

Amazon DevPay 安全字符。

每個使用 Amazon DevPay 的請求都需要兩個 x-amz-security-token 表單欄位:一個表示產品字符,另一個表示使用者字符。因此,必須以逗號分隔其值。例如,如果使用者字符為 eW91dHViZQ==,而產品字符為 b0hnNVNKWVJIQTA=,您會將政策項目設定為:{ "x-amz-security-token": "eW91dHViZQ==,b0hnNVNKWVJIQTA=" }

前面加上 x-amz-meta- 的其他欄位名稱

使用者指定的中繼資料。

支援完全符合與 starts-with

注意

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

條件比對

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

Condition 描述

完全符合

完全符合會確認欄位符合特定值。下列範例表示 ACL 必須設定為 public-read:

{"acl": "public-read" }

您也可以使用下列範例來表示 ACL 必須設定為 public-read:

[ "eq", "$acl", "public-read" ]

開頭為

如果值必須以特定值開頭,請使用 starts-with。下列範例表示金鑰必須以 user/betty 開頭:

["starts-with", "$key", "user/betty/"]

符合任何內容

若要設定政策以允許欄位中的任何內容,請使用 starts-with 並提供空白值。下列範例允許任何 success_action_redirect:

["starts-with", "$success_action_redirect", ""]

指定範圍

針對接受範圍的欄位,請以逗號分隔範圍的上下限。下列範例允許 1 到 10 MB 的檔案大小:

["content-length-range", 1048579, 10485760]

字元逸出

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

逸出序列 描述

\\

反斜線

\$

貨幣符號

\b

退格鍵

\f

Form Feed

\n

新行

\r

歸位字元

\t

水平標籤

\v

垂直標籤

\uxxxx

所有 Unicode 字元

建構簽章

步驟 描述
1

使用 UTF-8 進行政策的編碼。

2

使用 Base64 進行這些 UTF-8 位元組的編碼。

3

使用 HMAC SHA-1 透過私密存取金鑰簽署政策。

4

使用 Base64 進行 SHA-1 簽章的編碼。

如需身分驗證的一般資訊,請參閱 Amazon S3 的 Identity and Access Management

重新導向

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

一般重新導向

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

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

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

上傳前重新導向

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