AWS S3上传一个公开可读的对象



我使用的是AWS v2 java SDK。我正在尝试将一个对象上传到我的bucket中。我希望这个对象是公开可读的。

我所做的如下:

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控制台,我可以公开一个对象,所以我不认为这是一个bucket策略问题。

如何解决这个问题?我想把一个对象上传到一个bucket中,并使其公开可读

在我进行了更多的调试之后,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构建被中止了

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

请参阅:PutObjectAcl-亚马逊简单存储服务

为了完整起见,在设置公共读取头的同时上传对象的代码片段如下

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "text/plain");
connection.setRequestProperty("x-amz-acl", "public-read");
connection.setRequestMethod("PUT");
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
out.write("This text uploaded as an object via presigned URL.");  
out.close();  

关键部分是

connection.setRequestProperty("x-amz-acl", "public-read");

最新更新