Form POST 中间件¶
要确定您的对象存储系统是否支持此功能,请咨询您的服务提供商或使用 /info 路径发送一个 GET 请求。
您可以使用 form POST 中间件直接从浏览器将对象上传到对象存储系统。此中间件使用帐户或容器密钥生成请求的加密签名。这意味着您无需在 X-Auth-Token 标头中发送身份验证令牌即可执行请求。
form POST 中间件使用与临时 URL 中间件相同的密钥。有关如何设置这些密钥的信息,请参阅 密钥。
有关 form POST 中间件配置选项的信息,请参阅 源文档 中的 FormPost。
Form POST 格式¶
要将对象上传到集群,您可以使用 HTML form POST 请求。
form POST 请求的格式是
示例 1.14. Form POST 格式
<form action="SWIFT_URL"
method="POST"
enctype="multipart/form-data">
<input type="hidden" name="redirect" value="REDIRECT_URL"/>
<input type="hidden" name="max_file_size" value="BYTES"/>
<input type="hidden" name="max_file_count" value="COUNT"/>
<input type="hidden" name="expires" value="UNIX_TIMESTAMP"/>
<input type="hidden" name="signature" value="HMAC"/>
<input type="file" name="FILE_NAME"/>
<br/>
<input type="submit"/>
</form>
action=”SWIFT_URL”
设置为上传对象的完整 URL。上传文件的名称将附加到指定的 SWIFT_URL。因此,您可以直接上传到容器的根目录,URL 如下:
https://swift-cluster.example.com/v1/my_account/container/
可选地,您可以包含一个对象前缀来分隔上传,例如:
https://swift-cluster.example.com/v1/my_account/container/OBJECT_PREFIX
method=”POST”
必须是 POST。
enctype=”multipart/form-data”
必须是 multipart/form-data。
name=”redirect” value=”REDIRECT_URL”
上传完成后,将浏览器重定向到 REDIRECT_URL。URL 具有状态和消息查询参数,这些参数会添加到其中,用于指定上传的 HTTP 状态代码和可选的错误消息。2nn 状态代码表示成功。
REDIRECT_URL 可以是空字符串。如果是这样,则不会设置 Location 响应标头。
name=”max_file_size” value=”BYTES”
必需。指示单个文件上传的最大大小(以字节为单位)。
name=”max_file_count” value= “COUNT”
必需。指示表单可以上传的最大文件数。
name=”expires” value=”UNIX_TIMESTAMP”
UNIX 时间戳,指定表单必须在此时间之前提交,否则将失效。
name=”signature” value=”HMAC”
表单的 HMAC-SHA1 签名。
type=”file” name=”FILE_NAME”
要上传的文件的文件名。您可以包含从一个到 max_file_count 值的文件。
文件属性必须出现在其他属性之后才能正确处理。
如果属性出现在文件属性之后,它们将不会与子请求一起发送,因为除非将整个文件读入内存,否则无法在服务器端解析文件中的所有属性;服务器没有足够的内存来处理这些请求。文件属性后面的属性将被忽略。
可选地,如果您希望上传的文件是临时的,可以通过将以下其中一个作为表单输入来设置 x-delete-at 或 x-delete-after 属性
<input type="hidden" name="x_delete_at" value="<unix-timestamp>" />
<input type="hidden" name="x_delete_after" value="<seconds>" />
type= “submit”
必须是 submit。
Form POST 的 HMAC-SHA1 签名¶
Form POST 中间件使用 HMAC-SHA1 加密签名。此签名包括表单中的以下元素:
路径。从
/v1/开始,包括容器名称和可选的对象前缀。在 示例 1.15,“Form POST 的 HMAC-SHA1 签名”中,路径是/v1/my_account/container/object_prefix。在此阶段不要对路径进行 URL 编码。重定向 URL。如果没有重定向 URL,请使用空字符串。
最大文件大小。在 示例 1.15,“Form POST 的 HMAC-SHA1 签名”中,
max_file_size是104857600字节。要上传的最大对象数。在 示例 1.15,“Form POST 的 HMAC-SHA1 签名”中,
max_file_count是10。过期时间。在 示例 1.15,“Form POST 的 HMAC-SHA1 签名”中,过期时间设置为未来 ``600` 秒。
密钥。设置为帐户的
X-Account-Meta-Temp-URL-Key标头值或容器的X-Container-Meta-Temp-URL-Key标头值。有关更多信息,请参阅 密钥。
以下示例代码生成用于 form POST 的签名:
示例 1.15. Form POST 的 HMAC-SHA1 签名
import hmac
from hashlib import sha1
from time import time
path = '/v1/my_account/container/object_prefix'
redirect = 'https://myserver.com/some-page'
max_file_size = 104857600
max_file_count = 10
expires = int(time() + 600)
key = 'MYKEY'
hmac_body = '%s\n%s\n%s\n%s\n%s' % (path, redirect,
max_file_size, max_file_count, expires)
signature = hmac.new(key, hmac_body, sha1).hexdigest()
有关更多信息,请参阅 RFC 2104: HMAC: Keyed-Hashing for Message Authentication。
Form POST 示例¶
以下示例显示了如何使用 cURL 命令提交表单。在此示例中,对象前缀是 photos/,正在上传的文件名为 flower.jpg。
此示例使用 swift-form-signature 脚本来计算 expires 和 signature 值。
$ bin/swift-form-signature /v1/my_account/container/photos/ https://example.com/done.html 5373952000 1 200 MYKEY
Expires: 1390825338
Signature: 35129416ebda2f1a21b3c2b8939850dfc63d8f43
$ curl -i https://swift-cluster.example.com/v1/my_account/container/photos/ -X POST \
-F max_file_size=5373952000 -F max_file_count=1 -F expires=1390825338 \
-F signature=35129416ebda2f1a21b3c2b8939850dfc63d8f43 \
-F redirect=https://example.com/done.html \
-F file=@flower.jpg