

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

本节展示了使用 HTTP POST 请求将内容直接上传到 Amazon S3 的示例。

有关签名版本 4 的更多信息，请参阅[签名版本 4 签名流程](https://docs.amazonaws.cn/general/latest/gr/signature-version-4.html)。

## 使用 HTTP POST 将文件上传到 Amazon S3
<a name="sigv4-post-example-file-upload"></a>

此示例提供示例 POST 策略和可用于上传文件的表单。本主题使用示例策略和虚拟凭证来向您介绍工作流程以及生成的签名和策略哈希值。您可以将此数据用作测试套件来验证签名计算代码。

该示例使用以下示例凭证进行签名计算。您可以使用这些凭证来验证签名计算代码。但是，在向 Amazon 发送请求时，您必须将这些凭证替换为自己的凭证。


| 参数 | 值 | 
| --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | 
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | 

### 策略和表单示例
<a name="sigv4-post-example-file-upload-policy"></a>

以下 POST 策略支持在特定条件下上传到 Amazon S3。

```
 1. { "expiration": "2015-12-30T12:00:00.000Z",
 2.   "conditions": [
 3.     {"bucket": "sigv4examplebucket"},
 4.     ["starts-with", "$key", "user/user1/"],
 5.     {"acl": "public-read"},
 6.     {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},
 7.     ["starts-with", "$Content-Type", "image/"],
 8.     {"x-amz-meta-uuid": "14365123651274"},
 9.     {"x-amz-server-side-encryption": "AES256"},
10.     ["starts-with", "$x-amz-meta-tag", ""],
11. 
12.     {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},
13.     {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
14.     {"x-amz-date": "20151229T000000Z" }
15.   ]
16. }
```

此 POST 策略针对请求设置了以下条件：
+ 上传必须在 UTC 时间 2015 年 12 月 30 日中午之前进行。
+ 内容只能上传到 `sigv4examplebucket`。存储桶必须位于您在凭证范围（`x-amz-credential` 表单参数）中指定的区域，因为您提供的签名仅在此范围内有效。
+ 您可以提供任何以 `user/user1` 开头的键名称。例如 `user/user1/MyPhoto.jpg`。
+ ACL 必须设置为 `public-read`。
+ 如果上传成功，则用户的浏览器将重定向到 `http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html`。
+ 对象必须是一个映像文件。
+ `x-amz-meta-uuid` 标签必须设置为 `14365123651274`。
+ `x-amz-meta-tag` 可以包含任意值。

下面是此 POST 策略的 Base64 编码版本。在签名计算中，您可以使用此值作为 StringToSign。

```
1. eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9
```

当您复制/粘贴上述策略时，它应包含回车符和换行符，以便您计算的哈希值与此值匹配（即带有 CRLF 行终止符的 ASCII 文本）。

使用示例凭证创建签名，签名值如下所示 [在签名计算中，日期与策略中的 `x-amz-date` 日期相同（20151229）]：

```
8afdbf4008c03f22c2cd3cdb72e4afbb1f6a588f3255ac628749a66d7f09699e
```

以下示例表单指定了上述 POST 策略，并支持向 `sigv4examplebucket` 发出 POST 请求。将内容复制/粘贴到文本编辑器中，然后将其另存为 exampleform.html。然后，您可以使用 exampleform.html 将映像文件上传到特定的存储桶。如果您提供的签名与 Amazon S3 计算出的签名相匹配，您的请求将会成功。

**注意**  
您必须使用有效的值更新存储桶名称、日期、凭证、策略和签名，以便将其成功上传到 S3。

```
 1. <html>
 2.   <head>
 3.     
 4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 5.     
 6.   </head>
 7.   <body>
 8. 
 9.   <form action="http://sigv4examplebucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
10.     Key to upload: 
11.     <input type="input"  name="key" value="user/user1/${filename}" /><br />
12.     <input type="hidden" name="acl" value="public-read" />
13.     <input type="hidden" name="success_action_redirect" value="http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html" />
14.     Content-Type: 
15.     <input type="input"  name="Content-Type" value="image/jpeg" /><br />
16.     <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" /> 
17.     <input type="hidden" name="x-amz-server-side-encryption" value="AES256" /> 
18.     <input type="text"   name="X-Amz-Credential" value="AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request" />
19.     <input type="text"   name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" />
20.     <input type="text"   name="X-Amz-Date" value="20151229T000000Z" />
21. 
22.     Tags for File: 
23.     <input type="input"  name="x-amz-meta-tag" value="" /><br />
24.     <input type="hidden" name="Policy" value='{{<Base64-encoded policy string>}}' />
25.     <input type="hidden" name="X-Amz-Signature" value="{{<signature-value>}}" />
26.     File: 
27.     <input type="file"   name="file" /> <br />
28.     <!-- The elements after this will be ignored -->
29.     <input type="submit" name="submit" value="Upload to Amazon S3" />
30.   </form>
31.   
32. </html>
```

POST 参数不区分大小写。举例来说，可以指定 `x-amz-signature` 或 `X-Amz-Signature`。