我正在构建一个使用Multer-s3上传到Amazon存储桶的MEAN堆栈应用程序。 它似乎是将图像完美地上传到Amazon-S3中的存储桶以及数据库,但是当尝试从亚马逊获取图像时(使用ng-repeat)它会出现以下错误:
print
在我的mainController中:
GET https://s3-us-west-2.amazonaws.com/bucketfolder/bucketname/b40c4240-0417-11e6-9944-2d167e625d2b.jpg 403 (Forbidden)
我正在上传图片的Angular状态:
function mainController(Upload, API, S3_BUCKET, TokenService, User, $timeout) {
var self = this;
self.usersClothing = [];
self.uploadSingle = function() {
Upload.upload({
url: API + '/upload/single',
data: { file: self.file, type: self.clothingType }
})
.then(function(res) {
self.usersClothing = res.data.user.clothing.map(function(clothing) {
clothing.image = S3_BUCKET + clothing.image;
return clothing;
});
})
.catch(function(err) {
console.error(err);
});
}
答案 0 :(得分:2)
在您的上传代码段(POST
)中,您的代码正在服务器上执行,并且(我假设您可以确认)使用IAM实例配置文件(角色)或访问密钥来访问您的S3存储桶。
但是,您将从服务器传递到S3对象的URL到客户端(浏览器)。并且是浏览器向对象发出对{3}}的请求。浏览器没有您的AWS凭据。
因此,对于浏览器从S3存储桶下载对象,存储桶及其对象需要公开,以便无需身份验证即可下载。
示例存储桶策略:
GET
确保更改策略以替换真实存储桶名称。
这不需要您进行任何代码更改。
但是,这意味着您的存储桶对全世界都是公开的。为避免这种情况,您应该生成一个预先签名的URL,供客户端使用。使用{
"Version": "2008-10-17",
"Id": "Policy1397495964002",
"Statement": [
{
"Sid": "Stmt123",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::myBucketName/*"
}
]
}
生成预先签名的网址,并将该网址传递给您的客户端进行下载。
这需要对服务器端代码进行一些代码更改。
答案 1 :(得分:0)
修正了问题: 在我的亚马逊桶中,我更改了图像的首选项并将其设置为公共。然后它就能够发出GET请求。