无论您在签名的URL生成过程中设置了什么,您都必须在上传请求中发送Cache-Control
标头。
无论这是一个错误还是有意的行为都值得怀疑,超出了我的回答能力。正如您注意到的,Cache-Control
标题是已签名URL的一部分,但无论出于何种原因,在文件上载期间信息完全被忽略,即。没有在getSignedUrl()
函数中指定CacheControl
属性,仍然允许客户端将Cache-Control
标头设置为他们选择的任何值。
如果您需要控制Cache-Control
标题,那么使用getSignedUrl()
很可能不适合您的用例。
解决方案
AWS现在支持一个新的签名方案,称为AWS Signature version 4它允许在什么上载请求可能会或可能不包含完全的控制,包括的Header发送与什么样的价值观。
JavaScript SDK支持此新签名版本:createPresignedPost()
。
如何生成此预签署的POST
政策以及上传表单应该如何显示的详细示例可以直接在AWS's documentation上找到。
尽管该示例演示了通过标准http上传<form>
元素上传文件,但这些原则可以应用于任何能够执行HTTP通信的客户端/客户端。
例
为了完整起见,这里是例子的(从上面链接AWS文档页面获取)如何预签POST
政策的样子:
{ "expiration": "2015-12-30T12:00:00.000Z",
"conditions": [
{"bucket": "sigv4examplebucket"},
["starts-with", "$key", "user/user1/"],
{"acl": "public-read"},
{"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},
["starts-with", "$Content-Type", "image/"],
{"x-amz-meta-uuid": "14365123651274"},
{"x-amz-server-side-encryption": "AES256"},
["starts-with", "$x-amz-meta-tag", ""],
{"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},
{"x-amz-algorithm": "AWS4-HMAC-SHA256"},
{"x-amz-date": "20151229T000000Z" }
]
}
这POST政策规定下列条件在请求:
- UTC午夜之前必须发生在12月30日上传,到2015年
- 该内容只能上传到
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
可以包含任何值。
注意,在这个例子中的条件清单并非详尽无遗,CacheControl
被支持。请参阅creating a POST policy文档,了解您可以用这个做什么。