module.exports = function (express, router) {
var _ = require('lodash'),
aws = require('aws-sdk'),
AWSConfig = require('../../config/AWSConfig.json');
router.route('/resource/file/sign')
.post(function (req, res) {
var bucket = "myTestBucket";
aws.config.update({accessKeyId: AWSConfig.AWS_ACCESS_KEY, secretAccessKey: AWSConfig.AWS_SECRET_KEY});
var s3 = new aws.S3();
var options = {
Bucket: bucket,
Key: req.body.name,
Expires: 60,
ContentType: req.body.type,
ACL: 'private'
};
s3.getSignedUrl('putObject', options, function (err, data) {
if (err) {
return res.send('Error with S3')
}
res.json({
signed_request: data,
url: 'https://s3.amazonaws.com/' + bucket + '/' + req.body.name
})
})
});
return router;
};
此请求返回signed_request
并正常工作。
但是,当我尝试上传到网址时,我会在forbidden
请求中获得OPTIONS
。
我也收到CORS
错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 403.
这是我第一次尝试使用amazon s3
,所以我希望你们中的一些人能够指导我朝着正确的方向前进。
更新
我没有尝试编辑权限和cors标题现在cors错误消失但我仍然被禁止上传。
这是我的配置:
广告管理政策
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddCannedAcl",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::learningbank-test/*"
],
"Condition": {
"StringEquals": {
"s3:x-amz-acl": [
"public-read"
]
}
}
}
]
}
权限:
答案 0 :(得分:1)
您可以在存储桶上定义跨源资源共享(CORS)规则。有关详细信息和示例,请参阅documentation。
此外,请确保存储桶权限允许给定用户写入。从Introduction to S3 access control和Using bucket policies开始。
<强>更新强>
当请求中的canned ACL等于PutObject
时,您已在存储桶策略中定义了public-read
次授权。使用HTTP请求中的s3:x-amz-acl
标头继承该信息。
但是,您已在代码中将ACL定义为private
。尝试将其设置为public-read
以使其与存储桶策略声明匹配。