amazon-s3 - 使用 Clojure 的 Amazonica 创建 S3 签名 URL 时如何指定 ACL 策略?

标签 amazon-s3 clojure amazonica

我正在尝试使上传的 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?

最佳答案

我对此没有直接的答案,但有一个解决方法供您考虑:将 s3 存储桶中的所有对象默认为公开读取。

您可以通过将此存储桶策略添加到您的存储桶来执行此操作(当然要替换 bucketnm):

{
  "Id": "Policy1397632521960",
  "Statement": [
    {
      "Sid": "Stmt1397633323327",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketnm/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

关于amazon-s3 - 使用 Clojure 的 Amazonica 创建 S3 签名 URL 时如何指定 ACL 策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53403225/

相关文章:

javascript - 无法访问保存在 Javascript 代码中的存储桶中的图像

scala - 将 S3 挂载到数据 block

dictionary - 如何在不知道 Clojure 中的键的情况下将映射分解为键值对?

rest - 在 Clojure Luminus 中写入文件的简单 API

amazon-web-services - "The conditional request failed"而条件有效

amazon-web-services - 如何使用 Amazonica 库在 Clojure 中设置 S3 路径样式?

ios - 亚马逊网络服务 SDK iOS

javascript - AWS 从客户端上传文件到 S3

使用 Lamina : Simple clock code? 的 Clojure 函数式响应式(Reactive)编程 (FRP)