首页 > 解决方案 > AWS S3 上传公开可读的对象

问题描述

我正在使用 AWS v2 java SDK。我正在尝试将对象上传到我的存储桶。我希望该对象是公开可读的。

我所做的如下:

     PresignedPutObjectRequest presignedRequest =S3Presigner.create()
                .presignPutObject(z -> z.signatureDuration(Duration.ofMinutes(10))
                    .putObjectRequest(
                                por -> por.bucket("MYBUCKET")
                                    .key("MYOBJECTKEY")
                                    .acl(ObjectCannedACL.PUBLIC_READ)));
   URL url = presignedRequest.url(); 

然后我使用此 URL 上传文件。当我这样做时,我收到了 403 响应。

如果我删除添加 acl 的行,则上传有效。

如果我将 ACL 更改为 PRIVATE,那也会失败。

从我的 aws 控制台,我可以公开一个对象,所以我不认为这是一个存储桶策略问题。

如何解决这个问题?我想将对象上传到存储桶并使其公开可读

经过我的更多调试后,URL 的构建方式似乎存在问题。
当我不添加 ACL 时,这是 URL 的一部分

&X-Amz-SignedHeaders=host&X-Amz-Expires=120  

这是带有 ACL 的 URL 的类似部分

&X-Amz-SignedHeaders=host%3Bx-amz-acl&X-Amz-Expires=120  

看起来 URL 构建变得无聊

标签: javaamazon-web-servicesamazon-s3

解决方案


由于预签名 URL 仅在 ACL 公开时才授予访问权限,因此您可能需要添加x-amz-acl=public-read标头以满足约束。

请参阅:PutObjectAcl - Amazon 简单存储服务


推荐阅读