amazon-web-services - 上传到 S3 存储桶时出现 403 禁止错误
问题描述
我对 AWS 很陌生,但我很确定我的 IAM 用户设置正确……除了我还需要添加其他权限AmazonS3FullAccess
吗?这个名字暗示它应该足够了......要么是权限问题,要么是我的代码在某个地方搞砸了。
我试图按照https://devcenter.heroku.com/articles/s3-upload-node上的指南进行操作。任何帮助,将不胜感激。:)
这是我的相关代码:
//server side code
router.get('/sign-s3', (req, res) => {
const s3 = new aws.S3();
const { fileName, fileType } = req.query;
s3.getSignedUrl('putObject', {
Bucket: S3BUCKET,
Key: fileName,
Expires: 60,
ContentType: fileType,
ACL: 'public-read'
}, (err, data) => {
if (err) {
console.log(err);
res.status(500).json(err)
}
res.json({
signedRequest: data,
url: `https://${S3BUCKET}.s3.amazonaws.com/${fileName}`
});
});
});
//client side code
const onChangeHandler = (e) => {
const file = e.target.files[0];
axios
.get(`/api/bucket/sign-s3?fileName=${file.name}&fileType=${file.type}`)
.then(signedResponse => {
axios
.put(signedResponse.data.signedRequest,file, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
.then(response => {
console.log("upload successful");
props.addImages([signedResponse.data.url]);
})
.catch(error => console.error(error));
})
.catch(error => console.error(error));
}
更新:从我的标志路线中删除线路ACL: 'public-read'
允许上传通过,但没有人可以访问图像。:P 基于下面的 johns 评论,我认为这是某种标头问题,所以我'x-amz-acl': 'public-read'
在客户端的 put 请求中添加了标头,但它仍然给我同样的无效签名问题
解决方案
我收到与“AmazonS3FullAccess”的 IAM 用户相同的错误。对我有用的是添加这个 CORS 配置
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
推荐阅读
- python - 从列表和字典中创建给定值的字典
- google-chrome - VS2017 Chrome 浏览器调试器“对象引用未设置为对象的实例”
- c# - “条件表达式中的数据类型不匹配”疑难解答。在 MS Access Insert.Into 期间
- python - 如何在 CPLEX Python 中设置包含指标函数的目标函数?
- asp.net - 在 ASP.Net Core MVC 中,ControllerBase.StatusCode() 中使用的“价值”是什么?
- java - Spring Batch 跳过异常未按预期工作
- excel - 使用不断变化的源数据更改数据透视表列过滤器
- c++ - 段错误:链表节点插入函数 [C++]
- python - Python 3.6 正在打印文字字符 \t 和 \n
- angular - 上下文。$隐式。不是功能打字稿错误