cal*_*lum 7 javascript amazon-s3
按照本指南中的说明,我已设法通过签名网址上传.它看起来像这样:
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) => {
// ...
});
Run Code Online (Sandbox Code Playgroud)
...除了我的CacheControl参数(我自己添加;它不在指南中)似乎没有生效.当我使用上面的代码生成一个签名的URL并向其上传内容时,S3中的结果对象没有Cache-Control标题.
我究竟做错了什么?
Cache-Control无论您在签名URL生成期间设置了什么,您都必须在上传请求中发送标头.
这是一个错误还是一个故意的行为是值得怀疑的,超出了我的回答能力.该Cache-Control头,为你注意到没有,是标识的URL的一部分,但无论什么原因,信息的文件上传,即在完全忽略.不在函数中指定CacheControl属性getSignedUrl()仍允许客户端将Cache-Control标头设置为他们选择的任何值.
如果您需要控制Cache-Control标题,那么使用getSignedUrl()它很可能不适合您的用例.
AWS现在支持一种名为AWS Signature第4版的新签名方案,该方案允许完全控制上载请求可能包含或不包含的内容,包括发送哪些标头以及具有哪些值.
JavaScript SDK支持这种新的签名版本:createPresignedPost().
有关如何生成此预签名POST策略以及上载表单应如何显示的详细示例,可以直接在AWS的文档中找到.
尽管该示例通过标准http上传<form>元素演示了文件上载,但原则可以应用于能够执行HTTP通信的任何客户端/消费者.
为了完整起见,以下是预签名POST策略的示例(以上链接的AWS文档页面):
{ "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" }
]
}
Run Code Online (Sandbox Code Playgroud)
此POST策略在请求上设置以下条件:
sigv4examplebucket.存储桶必须位于您在凭据范围(x-amz-credential表单参数)中指定的区域中,因为您提供的签名仅在此范围内有效.user/user1.例如,user/user1/MyPhoto.jpg.public-read.http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html.x-amz-meta-uuid标签必须设置为14365123651274.x-amz-meta-tag可以包含任何价值.请注意,在这个例子中的条件清单并非详尽无遗CacheControl 的支持.请参阅创建POST策略文档,了解如何使用此文档.
| 归档时间: |
|
| 查看次数: |
1380 次 |
| 最近记录: |