

# 创建 HTML 表单（使用 Amazon 签名版本 4）
<a name="sigv4-HTTPPOSTForms"></a>

**Topics**
+ [HTML 表单声明](#HTTPPOSTFormDeclaration)
+ [HTML 表单字段](#sigv4-HTTPPOSTFormFields)

要支持用户使用其浏览器（HTTP POST 请求）将内容上传到 Amazon S3，应使用 HTML 表单。HTML 表单由表单声明和表单字段组成。表单声明包含关于请求的高级别信息。表单字段包含详细的请求信息。

本节介绍如何创建 HTML 表单。有关使用 HTTP POST 和相关签名计算来进行请求身份验证的基于浏览器的上传的工作示例，请参阅[示例：使用 HTTP POST 的基于浏览器的上传（使用 Amazon 签名版本 4）](sigv4-post-example.md)。

必须采用 UTF-8 编码表单和策略。您可以通过在 `content` 属性中指定 `charset=UTF-8` 来将 UTF-8 编码应用于表单。下面是 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
```

**注意**  
表单数据和边界（不包括文件的内容）不得超过 20 KB。

## HTML 表单声明
<a name="HTTPPOSTFormDeclaration"></a>

HTML 表单声明具有以下三个属性：

 
+ `action`：用于处理请求的 URL，它必须设置为存储桶的 URL。例如，如果存储桶的名称为 `examplebucket`，则 URL 为 `http://examplebucket.s3.amazonaws.com/`。
**注意**  
在表单字段中指定键名。
+  `method`：方法必须是 POST。
+  `enctype`：必须针对文件上传和文本区域上传，将附件类型 (`enctype`) 设置为“分段/表单数据”。有关 `enctype` 的更多信息，请参阅 [RFC 1867](http://www.ietf.org/rfc/rfc1867.txt)。

这是存储桶 `examplebucket` 的表单声明。

```
1. <form action="http://examplebucket.s3.amazonaws.com/" method="post"
2. 
3. enctype="multipart/form-data">
```

## HTML 表单字段
<a name="sigv4-HTTPPOSTFormFields"></a>

下表介绍可以在表单中使用的字段的列表。除其它字段外，还有一个可用于对请求进行身份验证的签名字段。提供了一些字段供您指定签名计算算法 (`x-amz-algorithm`)、用于生成签名密钥的凭证范围 (`x-amz-credential`) 以及用于计算签名的日期 (`x-amz-date`)。Amazon S3 使用这些信息来重新创建签名。如果签名匹配，Amazon S3 将处理该请求。

**注意**  
变量 `${filename}` 将自动替换为用户提供的文件的名称，并且可由所有表单字段识别。如果浏览器或客户端提供指向文件的完整或部分路径，则只会使用跟在最后一个斜杠（/）或反斜杠（\\）之后的文本（例如，`C:\Program Files\directory1\file.txt` 解释为 `file.txt`）。如果没有提供文件或文件名，变量将替换为空字符串。

如果您未提供经过身份验证的请求所需的元素（例如 `policy` 元素），则该请求将被视为匿名请求，只有在将存储桶配置为进行公开读取和写入时，请求才会成功。


| 元素名称 | 说明 | 必填 | 
| --- | --- | --- | 
| acl | Amazon S3 访问控制列表 (ACL)。如果指定的 ACL 无效，Amazon S3 会拒绝该请求。有关 ACL 的更多信息，请参阅[使用 Amazon S3 ACL](https://docs.amazonaws.cn/AmazonS3/latest/userguide/S3_ACLs_UsingACLs.html)。<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`<br />`Content-Disposition`<br />`Content-Encoding`<br />`Expires` | 特定于 REST 的标头。有关更多信息，请参阅 [PutObject](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutObject.html)。 | 否 | 
| key | 已上传的对象的键名称。<br />要使用由用户提供的文件名，请使用 ${filename} 变量。例如，如果您上传文件 `photo1.jpg` 并将 `/user/user1/${filename}` 指定为键名称，则该文件将存储为 `/user/user1/photo1.jpg`。<br />有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[对象键和元数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingMetadata.html)。 | 是 | 
| policy | 以 base64 编码的安全策略，用于描述请求中允许的内容。对于经过身份验证的请求，需要一个策略。<br />不带安全策略的请求被认为是匿名的，只会在公共可写的存储桶上取得成功。 | 经过身份验证的请求所必需 | 
| success\_action\_redirect | 上传成功后客户端重定向到的 URL。<br />如果未指定 `success_action_redirect`，或者 Amazon S3 无法解释 URL，则 Amazon S3 将返回在 `success_action_status` 字段中指定的空文档类型。<br />如果上传失败，Amazon S3 将返回错误，而不会将用户重定向到另一个 URL。<br /> | 否 | 
| success\_action\_status | 在未指定 `success_action_redirect` 的情况下，成功上传后返回到客户端的状态代码。<br />有效值为 `200`、`201` 或 `204`（默认值）。<br />如果值设置为 200 或 204，Amazon S3 将返回一个空文档以及指定的状态代码。<br />如果值设置为 201，Amazon S3 将返回一个 XML 文档和一个 201 状态代码。有关 XML 文档内容的信息，请参阅 [POST Object](RESTObjectPOST.md)。<br />如果该值未设置或无效，Amazon S3 将返回一个空文档和一个 204 状态代码。 某些版本的 Adobe Flash player 无法正确处理使用空白正文的 HTTP 响应。要通过 Adobe Flash 支持上传，建议您将 `success_action_status` 设置为 201。  | 否 | 
| x-amz-algorithm | 用于对请求进行身份验证的签名算法。对于 Amazon 签名版本 4，该值为 `AWS4-HMAC-SHA256`。<br /> 如果策略文档随请求一起提供，则此字段为必填字段。 | 经过身份验证的请求所必需 | 
| x-amz-credential |  除了访问密钥 ID 外，此字段还提供范围信息，用于标识签名对其有效的区域和服务。这应该与您在计算签名密钥以进行签名计算时使用的范围相同。<br />它是采用以下形式的字符串：<br />`{{<your-access-key-id>}}/{{<date>}}/{{<aws-region>}}/{{<aws-service>}}/aws4_request `<br />例如：<br /> ` AKIAIOSFODNN7EXAMPLE/20130728/us-east-1/s3/aws4_request` ` `<br />  对于 Amazon S3，aws-service 字符串为 s3。有关 Amazon S3 aws-region 字符串的列表，请参阅《Amazon Web Services 一般参考》中的[区域和端点](https://docs.amazonaws.cn/general/latest/gr/rande.html#s3_region)。如果策略文档随请求一起提供，则此元素为必需项。 | 经过身份验证的请求所必需 | 
| x-amz-date | 它是采用 ISO8601 格式的日期值。例如 `20130728T000000Z`。<br />它与您创建签名密钥时使用的日期相同（例如，20130728）。该值也必须与您在签名的策略 (`x-amz-date`) 中提供的值相同。<br />如果策略文档随请求一起提供，则此元素为必需项。 | 经过身份验证的请求所必需 | 
| x-amz-security-token | Amazon DevPay 和会话凭证使用的安全令牌<br /> 如果请求正在使用 Amazon DevPay，它需要两个 `x-amz-security-token` 表单字段：一个用于产品令牌，另一个用于用户令牌。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用 DevPay](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingDevPay.html)。<br />如果请求正在使用会话凭证，它需要一个 `x-amz-security-token` 表单。有关更多信息，请参阅《IAM 用户指南》**中的[请求临时安全凭证](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_temp_request.html)。 | 否 | 
| x-amz-signature | （Amazon 签名版本 4）安全策略的 HMAC-SHA256 哈希值。<br /> 如果策略文档随请求一起提供，则此字段为必填字段。 | 经过身份验证的请求所必需 | 
| x-amz-meta-\* | 以此前缀开头的字段名称是用户定义的元数据。每个元数据均以一组键-值对的形式存储和返回。Amazon S3 不验证或解释用户定义的元数据。有关更多信息，请参阅 [PutObject](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutObject.html)。 | 否 | 
| x-amz-\* | 有关其它 `x-amz-*` 标头，请参阅 POST 对象（[POST Object](RESTObjectPOST.md)）。 | 否 | 
| file | 文件或文本内容。<br />文件或内容必须是表单中的最后一个字段。<br />您一次仅能上传一个文件。 | 是 | 

对于经过身份验证的请求，条件项是必需的；对于匿名请求，条件项是可选的。

现在您已知道如何创建表单，接下来可以创建您可以签名的安全策略。有关更多信息，请参阅 [POST 策略](sigv4-HTTPPOSTConstructPolicy.md)。