POST Object
描述:POST方式上传一个文件(基于浏览器表单的上传方式)。
请求格式:
POST / HTTP/1.1
Host: <Your-Bucket-Name>.ss.bscstorage.com
Content-Length: <length>
Content-Type:multipart/form-data; boundary=----WebKitFormBoundary1dIjDASRYXQm6DNA
------WebKitFormBoundary1dIjDASRYXQm6DNA
Content-Disposition: form-data; name="key"
destinationProject/${filename}
------WebKitFormBoundary1dIjDASRYXQm6DNA
Content-Disposition: form-data; name="success_action_redirect"
http://123.abc.com/1.php?f=1111.txt
------WebKitFormBoundary1dIjDASRYXQm6DNA
Content-Disposition: form-data; name="AWSAccessKeyId"
00M414ZO0X30
------WebKitFormBoundary1dIjDASRYXQm6DNA
Content-Disposition: form-data; name="Policy"
eyJleHBpcmF0aW9uIjoiMjAxMi0wNi0wNlQwNjozOTo0MS4wMDBaIiwiY29uZGl0aW9ucyI6W3siYnVja2V0IjoiczN4cC5zM3dhdGNoIn0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCJhbmdlbFwvIl1dfQ==
------WebKitFormBoundary1dIjDASRYXQm6DNA
Content-Disposition: form-data; name="Signature"
VK6Kw4kRqW2e84ZIX2cV2QqHo58=
------WebKitFormBoundary1dIjDASRYXQm6DNA
Content-Disposition: form-data; name="file"; filename="112233.txt"
Content-Type: text/plain
------WebKitFormBoundary1dIjDASRYXQm6DNA
Content-Disposition: form-data; name="submit"
上传
------WebKitFormBoundary1dIjDASRYXQm6DNA-
- 表单元素:
Name | Description | Required |
---|---|---|
AWSAccessKeyId | 就是AccessKey,可以到控制台获取 | Yes |
key |
object上传后的key(路径),例如:angel/${filename},变量
${filename}将被自动替换成被上传文件的文件名;当然也可以直接指定被上传文件存储在存储中的文件名。如:angel/path/to/myfile.txt, 变量名可以为: filename, sha1, md5, size |
Yes |
acl | 文件的ACL:创建文件的同时,设置一个ACL。请参照《ACL》 | No |
success_action_status |
上传成功后的响应码,可以设置的值为:200, 201, or 204(defalut),
若设置为200或者204, 则返回body为空, status为200或者204,
若设置为201, 则返回xml格式的body, stats为201, 如果设置为非法的值, 则忽略该值,使用默认值204 注: 如果设置success_action_redirect或者redirect, 则忽略该设置 |
No |
success_action_redirect, redirect | 上传成功后客户端重定向的URL,实际返回的location会在原来的URL加上bucket, key和etag querystring | No |
Policy | 文件的策略,json格式字符串,并使用base64进行编码。后面详细介绍 | Yes |
Signature | 使用SecretKey签名后的字符串。后面详细介绍 | Yes |
file | type=file的input表单 | Yes |
x-amz-meta-* | 用户自定义MetaDeta, header以x-amz-meta-开头, 所有meta以key:value的形式存储,最大限制64KB, HEAD或者GET时原样返回 | No |
Cache-Control, Content- Type, Content-Disposition, Content-Encoding, Expires | 和put_file一样, 参考put_file接口 | No |
Policy的构建:
策略是使用 UTF-8 和 Base64 编码的 JSON 文档,它指定了请求必须满足的条件并且用于对内容进行身份验证。根据您设计策略文档的方式,您可以对每次上传、每个用户、所有上传或根据其他能够满足您需要的设计来使用它们。
{
"expiration": "2014-04-10T08:55:34.000Z",
"conditions": [
{
"bucket": "my-bucket-name"
},
{
"acl": "private"
},
[
"starts-with", "$key", "my_prefix/"
],
[
"content-length-range", 0, 52428800
]
]
}
以上示例的说明:
- 上传必须在”2014-04-10T08:55:34.000Z”之前。
- 文件上传到名为”my-bucket-name”的bucket。
- starts-with:$key必须以”my_prefix/”开始 (Policy中”$key”前必须带”$”)。若$key值为空,文件名前无前缀。
- content-length-range:文件大小必须在指定范围内。
- 最终将policy进行base64编码设置到表单Policy的value中。
expiration:
expiration用于指定policy的过期时间, 采用ISO 8601 UTC日期格式来指定策略的过期日期。例如,“2007-12-01T12:00:00.000Z”指定, 在策略中过期是必需的。
Condition:
Condition用于验证上传的对象的内容与表单冲填写的域
Condition 类型
Condition | Description |
---|---|
精确匹配 |
1. 精确匹配将验证字段是否匹配特定的值。此示例指示ACL 必须设置为公共读取:{"acl": "public-read" } 2.ACL 必须设置为公共读取的替代方法: [ "eq", "$acl", "public-read" ] |
Starts With | 如果值必须从某个特定的值开始,请使用starts-with。本示例指示密钥必须从user/betty 开始:["starts-with", "$key", "user/betty/"] |
指定范围 | 对于接受范围的字段,请使用逗号来分隔上限和下限值。本示例允许1 到10 MB 的 文件大小:["content-length-range", 1048579, 10485760], 单位字节 |
Conditions 字段
策略文档中的条件验证上传的对象的内容。您在表单中指定的每个表单字段(AWSAccessKeyId、Signature、 file、Policy除外)都可以作为条件
Signature的构建:
- 用UTF-8对policy进行编码
- 用Base64对UTF-8形式的policy进行编码
- 用HMAC SHA-1和你的Secret Key将你的policy进行转换。最后进行base64编码。如:使用php时,base64_encode( hash_hmac( "sha1", $policy, $SECRETKEY, true ) );
- 将最终的值设置到表单Signature的value中。
- 最终生成的html表单:
<form method="post" action="http://my-bucket.<?=c('api_host');?>/" enctype="multipart/form-data">
<input type="hidden" name="AWSAccessKeyId" value="您的accesskey" />
<input type="hidden" name="key" value="my_prefix/${filename}" />
<input type="hidden" name="acl" value="private" />
<input type="hidden" name="success_action_status" value="201" />
<input type="hidden" name="Policy" value="eyJleHBpcmF0aW9uIjoiMjAxNC0wNC0xMFQwOToxNzozMC4wMDBaIiwiY29uZGl0aW9ucyI6W3siYnVja2V0IjoiY2xvdWQxMjMqwqwsdifsdGFydHMtd2l0aCIsIiRrZXkiLCJteWZpbGVzLyJdLFsic3RhcnRzLXdpdGgiLCIkQ29udGVudC1UeXBlIiwiIl0sWyJzdGFydHMtd2l0aCIsIiRDb250ZW50LURpc3Bvc2l0aW9uIiwiIl0seyJ1aWQiOiIxMjMifSxbImNvbnRlbnQtbGVuZ3RoLXJhbmdlIiwwLDUyNDI4ODAwXV19" />
<input type="hidden" name="Signature" value="HnOSk3kfx5LFtn4CIiFcSglQUXc=" />
<input type="file" name="file" />
<input type="submit" value="上传" />
</form>
- 注意事项:
- POST请求后的uri只能是“/”
- success_action_redirect:指定上传成功后客户端重定向的URL。
- key:变量${filename}将被自动替换成被上传文件的文件名;