java - 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 构建变得无聊
解决方案
由于预签名 URL 仅在 ACL 公开时才授予访问权限,因此您可能需要添加x-amz-acl=public-read
标头以满足约束。
推荐阅读
- safari - 使用 Web Audio API webkitAudioContext() 在 Safari 中没有声音
- java - 优化代码以提高内存和速度
- spring-boot - 使用 Liquibase 和 JPA 实体生成变更日志
- database - 将数据互连以降低数据库查询的最佳方式 [通用,无特定语言]
- django - 唯一约束失败:更新用户信息时 auth_user.username
- asp.net - ASP.NET Core MVC 中 Layout.cshtml 中的访问请求或 IQueryCollection?
- php - 从 else 语句中删除空行
- python - 这个打印语法是如何工作的?print('某事', ['a', 'list'][boolean])
- javascript - 如何解释 chrome devtool 中的“渲染、绘画、加载和脚本”性能
- reactjs - 显式类型检查后打字稿不可分配错误