我正在尝试使上传的ACL为public-read。对于Amazonica来说,文档非常单薄,经过几个小时的修修补补,我还没有弄清楚如何实现这个目标。简而言之,我不知道如何让它对头部进行签名。
在服务器端,我的代码如下所示。
(s3/generate-presigned-url
creds
{:bucket-name "mybucket"
:method "PUT"
:expires 10000
:key "my-key"
:cache-control "max-age=31557600;"
:request-parameters {:x-amz-acl "public-read"}
})在客户端,我获取创建和执行XHR PUT请求的URL
var xhr = new XMLHttpRequest();
xhr.open("PUT", signedUrl);
xhr.setRequestHeader('Cache-Control', 'max-age=31557600')
xhr.onload = ...
xhr.onerror = ...
xhr.send(file);这种方法工作得很好,除了它的ACL错误:"private“而不是"public”。
添加客户端很容易
var xhr = new XMLHttpRequest();
xhr.open("PUT", signedUrl);
xhr.setRequestHeader('Cache-Control', 'max-age=31557600')
xhr.setRequestHeader('x-amz-acl', 'public-read')
xhr.onload = ...
xhr.onerror = ...
xhr.send(file);但是由于HeadersNotSigned的原因,请求当然会失败。我根本想不出怎么把它添加到服务器端,这样它们才能被签名。SignedHeaders部分从不包含任何其他参数。
我盲目地尝试了各种组合
(s3/generate-presigned-url
creds
{:headers {:x-amz-acl "public-read"}
:x-amz-acl "public-read"
:metadata {:x-amz-acl "public-read"}
:signed-headers {:x-amz-acl "public-read"}
:amz-acl "public-read"
:x-amz-signed-headers {:x-amz-acl "public-read"}
:X-Amz-SignedHeaders ["x-amz-acl"]
:request-parameters {:x-amz-acl "public-read"}
})如何将ACL策略添加到已签名的url?
发布于 2018-11-21 12:55:14
我没有直接的答案,但有一个变通办法供您考虑:将s3存储桶中的所有对象默认为公共读取。
您可以通过将此存储桶策略添加到您的存储桶中(当然要替换bucketnm )来完成此操作:
{
"Id": "Policy1397632521960",
"Statement": [
{
"Sid": "Stmt1397633323327",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucketnm/*",
"Principal": {
"AWS": [
"*"
]
}
}
]
}https://stackoverflow.com/questions/53403225
复制相似问题