按照 this guide 中的说明进行操作,我已经设法让上传通过签名的 URL 工作。它看起来像这样:
const s3 = new aws.S3();
const s3Params = {
Bucket: S3_BUCKET,
Key: fileName,
Expires: 60,
ContentType: fileType,
ACL: 'public-read',
CacheControl: 'public, max-age=31536000',
};
s3.getSignedUrl('putObject', s3Params, (err, data) => {
// ...
});
...除了我的 CacheControl
参数(我自己添加;它不在指南中)似乎没有生效。当我使用上面的代码生成签名 URL 并向其上传内容时,S3 中生成的对象没有 Cache-Control
header 。
我做错了什么?
最佳答案
您必须发送 Cache-Control
上传请求中的 header ,无论您在签名 URL 生成期间设置了什么。
这是一个错误还是故意的行为是值得怀疑的,超出了我的回答能力。 Cache-Control
正如您所注意到的, header 是签名 URL 的一部分,但无论出于何种原因,该信息在文件上传过程中都被完全忽略了,即。未指定 CacheControl
getSignedUrl()
中的属性(property)函数仍然允许客户端设置 Cache-Control
header 到他们选择的任何值。
如果您需要控制 Cache-Control
header ,然后使用 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 策略对请求设置了以下条件:
- 上传必须在世界标准时间 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
可以包含任何值。
请注意,此示例中的条件列表并不详尽并且 CacheControl
被支持。查看creating a POST policy记录您可以用它做什么。
关于javascript - 如何通过签名 URL 在 S3 对象上定义 Cache-Control header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43525423/