

# 使用 POST 的基于浏览器的上传（Amazon 签名版本 4）
<a name="sigv4-UsingHTTPPOST"></a>

本节讨论如何使用 HTTP POST 请求通过浏览器将文件直接上传到 Amazon S3。它还包含有关如何使用 Amazon Amplify JavaScript 库通过基于浏览器的上传将文件上传到 Amazon S3 的信息。

**Topics**
+ [POST Object](RESTObjectPOST.md)
+ [POST Object restore](RESTObjectPOSTrestore.md)
+ [使用 HTTP POST 的基于浏览器的上传](#sigv4-UsingHTTPPOST-how-to)
+ [计算签名](#sigv4-post-signature-calc)
+ [创建 HTML 表单（使用 Amazon 签名版本 4）](sigv4-HTTPPOSTForms.md)
+ [POST 策略](sigv4-HTTPPOSTConstructPolicy.md)
+ [示例：使用 HTTP POST 的基于浏览器的上传（使用 Amazon 签名版本 4）](sigv4-post-example.md)
+ [使用 Amazon Amplify 库通过基于浏览器的上传来上传到 Amazon S3](browser-based-uploads-aws-amplify.md)

## 使用 HTTP POST 的基于浏览器的上传
<a name="sigv4-UsingHTTPPOST-how-to"></a>

Amazon S3 支持 HTTP POST 请求，以便用户可以直接将内容上传到 Amazon S3。通过使用 POST，最终用户可以对请求进行身份验证，而无需通过用于保护凭证的安全中间节点传递数据。因此，HTTP POST 有可能减少延迟。

下图演示了使用 POST 请求的 Amazon S3 上传。

![S3 PUT 工作流程（客户到服务器再到 S3）与 POST 工作流程（客户直接传输到 S3）的比较。](http://docs.amazonaws.cn/AmazonS3/latest/developerguide/images/s3_post.png)


1.  用户通过 Web 浏览器访问您的页面。

1.  Web 页面包含一个 HTML 表单，其中包含用户将内容上传到 Amazon S3 所需的所有信息。

1.  用户通过 Web 浏览器将内容上传到 Amazon S3。

用于发送基于浏览器的 POST 请求的过程如下：

 

1. 创建安全策略，以指定条件来限制您希望请求中所支持的内容，例如，可以在其中上传对象的存储桶名称，以及对于正在创建的对象要支持的密钥名称前缀。

1. 创建基于该策略的签名。对于经过身份验证的请求，此表单必须包含有效的签名和策略。

1. 创建一个 HTML 表单，供用户访问以便将对象上传到您的 Amazon S3 存储桶。

下一节介绍如何创建签名来对请求进行身份验证。有关创建表单和安全策略的信息，请参阅[创建 HTML 表单（使用 Amazon 签名版本 4）](sigv4-HTTPPOSTForms.md)。

## 计算签名
<a name="sigv4-post-signature-calc"></a>

对于经过身份验证的请求，HTML 表单必须包含用于安全策略和签名的字段。

 
+ 安全策略（请参阅 [POST 策略](sigv4-HTTPPOSTConstructPolicy.md)）控制请求中支持的内容。
+ 安全策略是签名计算中的 `StringToSign`（请参阅[对请求进行签名简介](sig-v4-authenticating-requests.md#signing-request-intro)）。

 

![StringToSign、签名密钥以及签名。](http://docs.amazonaws.cn/AmazonS3/latest/developerguide/images/sigV4-post.png)






**计算签名**

1. 使用 UTF-8 编码创建策略。

1. 将 UTF-8 编码的策略字节转换为 base64。结果为 `StringToSign`。

1. 创建签名密钥。

1. 使用签名密钥，通过 HMAC-SHA256 签名算法对 `StringToSign` 进行签名。

有关创建 HTML 表单、安全策略和示例的更多信息，请参阅以下内容：


+ [创建 HTML 表单（使用 Amazon 签名版本 4）](sigv4-HTTPPOSTForms.md)
+ [POST 策略](sigv4-HTTPPOSTConstructPolicy.md)
+ [示例：使用 HTTP POST 的基于浏览器的上传（使用 Amazon 签名版本 4）](sigv4-post-example.md)

