创建 HTML 表单(使用 Amazon 签名版本 4)
要支持用户使用其浏览器(HTTP POST 请求)将内容上传到 Amazon S3,应使用 HTML 表单。HTML 表单由表单声明和表单字段组成。表单声明包含关于请求的高级别信息。表单字段包含详细的请求信息。
本节介绍如何创建 HTML 表单。有关使用 HTTP POST 和相关签名计算来进行请求身份验证的基于浏览器的上传的工作示例,请参阅示例:使用 HTTP POST 的基于浏览器的上传(使用 Amazon 签名版本 4)。
必须采用 UTF-8 编码表单和策略。您可以通过在 content 属性中指定 charset=UTF-8 来将 UTF-8 编码应用于表单。下面是 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
注意
表单数据和边界(不包括文件的内容)不得超过 20 KB。
HTML 表单声明
HTML 表单声明具有以下三个属性:
-
action:用于处理请求的 URL,它必须设置为存储桶的 URL。例如,如果存储桶的名称为examplebucket,则 URL 为http://examplebucket.s3.amazonaws.com/。注意
在表单字段中指定键名。
-
method:方法必须是 POST。 -
enctype:必须针对文件上传和文本区域上传,将附件类型 (enctype) 设置为“分段/表单数据”。有关enctype的更多信息,请参阅 RFC 1867。
这是存储桶 examplebucket 的表单声明。
<form action="http://examplebucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
HTML 表单字段
下表介绍可以在表单中使用的字段的列表。除其它字段外,还有一个可用于对请求进行身份验证的签名字段。提供了一些字段供您指定签名计算算法 (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。 类型:字符串 默认值:private 有效值: |
否 |
Cache-Control
|
特定于 REST 的标头。有关更多信息,请参阅 PutObject。 |
否 |
key |
已上传的对象的键名称。 要使用由用户提供的文件名,请使用 ${filename} 变量。例如,如果您上传文件 有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的对象键和元数据。 |
是 |
policy |
以 base64 编码的安全策略,用于描述请求中允许的内容。对于经过身份验证的请求,需要一个策略。 不带安全策略的请求被认为是匿名的,只会在公共可写的存储桶上取得成功。 |
经过身份验证的请求所必需 |
success_action_redirect |
上传成功后客户端重定向到的 URL。 如果未指定 如果上传失败,Amazon S3 将返回错误,而不会将用户重定向到另一个 URL。 |
否 |
success_action_status |
在未指定 有效值为 如果值设置为 200 或 204,Amazon S3 将返回一个空文档以及指定的状态代码。 如果值设置为 201,Amazon S3 将返回一个 XML 文档和一个 201 状态代码。有关 XML 文档内容的信息,请参阅 POST Object。 如果该值未设置或无效,Amazon S3 将返回一个空文档和一个 204 状态代码。 注意某些版本的 Adobe Flash player 无法正确处理使用空白正文的 HTTP 响应。要通过 Adobe Flash 支持上传,建议您将 |
否 |
x-amz-algorithm |
用于对请求进行身份验证的签名算法。对于 Amazon 签名版本 4,该值为 如果策略文档随请求一起提供,则此字段为必填字段。 |
经过身份验证的请求所必需 |
x-amz-credential |
除了访问密钥 ID 外,此字段还提供范围信息,用于标识签名对其有效的区域和服务。这应该与您在计算签名密钥以进行签名计算时使用的范围相同。 它是采用以下形式的字符串:
例如:
对于 Amazon S3,aws-service 字符串为 s3。有关 Amazon S3 aws-region 字符串的列表,请参阅《Amazon Web Services 一般参考》中的区域和端点。如果策略文档随请求一起提供,则此元素为必需项。 |
经过身份验证的请求所必需 |
x-amz-date |
它是采用 ISO8601 格式的日期值。例如 它与您创建签名密钥时使用的日期相同(例如,20130728)。该值也必须与您在签名的策略 ( 如果策略文档随请求一起提供,则此元素为必需项。 |
经过身份验证的请求所必需 |
x-amz-security-token |
Amazon DevPay 和会话凭证使用的安全令牌 如果请求正在使用 Amazon DevPay,它需要两个 如果请求正在使用会话凭证,它需要一个 |
否 |
x-amz-signature |
(Amazon 签名版本 4)安全策略的 HMAC-SHA256 哈希值。 如果策略文档随请求一起提供,则此字段为必填字段。 |
经过身份验证的请求所必需 |
x-amz-meta-* |
以此前缀开头的字段名称是用户定义的元数据。每个元数据均以一组键-值对的形式存储和返回。Amazon S3 不验证或解释用户定义的元数据。有关更多信息,请参阅 PutObject。 |
否 |
x-amz-* |
有关其它 |
否 |
file |
文件或文本内容。 文件或内容必须是表单中的最后一个字段。 您一次仅能上传一个文件。 |
是 |
对于经过身份验证的请求,条件项是必需的;对于匿名请求,条件项是可选的。
现在您已知道如何创建表单,接下来可以创建您可以签名的安全策略。有关更多信息,请参阅 POST 策略。