我不明白......看起来很简单,但是对于put请求的选项调用失败了。 "预检的响应无效"
S3 CORS:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
网址:
http://localhost:9002/api/sign_s3?file_name=wCyQZgrKIS24oR4MV4hdPP-UXDNQ6P9MvOj6DRMPcJU.jpg&file_type=image/jpeg
s3的网址(已删除密钥):
https://jayehtest.s3.amazonaws.com/wCyQZgrKIS24oR4MV4hdPP-UXDNQ6P9MvOj6DRMPcJU.jpg?AWSAccessKeyId=xxx&Content-Type=image%2Fjpeg&Expires=1454923884&Signature=xxx&x-amz-acl=public-read
生成put的代码:
Aws.config.update({accessKeyId: process.env.AWS_ACCESS_KEY, secretAccessKey: process.env.AWS_SECRET_KEY});
var s3 = new Aws.S3();
var s3_params = {
Bucket: process.env.S3_BUCKET,
Key: req.query.file_name,
//Expires: 120,
//ContentType: req.query.file_type,
ContentType: "multipart/form-data",
ACL: 'public-read-write',
};
s3.getSignedUrl('putObject', s3_params, function(err, data){
console.log('got signed url!');
if(err)
res.status(500).json({error: err});
else
res.status(200).json({
signed_request: data,
url: 'https://'+process.env.S3_BUCKET+'.s3.amazonaws.com/'+req.query.file_name
});
});
发出请求的代码:
Superagent('get', '/api/sign_s3?file_name='+files[0].name+'&file_type='+files[0].type).end(function(err, response) {
console.log('signs3 response: ', response);
Superagent('put', response.body.signed_request)
//Superagent('put', 'https://jayehtest.s3-us-west-2.amazonaws.com/10172871_10101161917002037_713851410092755221_n.jpg?AWSAccessKeyId=AKIAJOQ7AL7QGIGSXMQQ&Content-Type=image%2Fjpeg&Expires=1454947575&Signature=nBvjbkCLD5XsvFktEjnQOTdRFzM%3D&x-amz-acl=public-read'
.set('x-amz-acl', 'public-read-write')
.set('Content-Type', 'multipart/form-data')
.attach('image', files[0])
.end(cb);
});
答案 0 :(得分:1)
S3有很多愚蠢的层,但我需要完成一些事情:
标题需要完全匹配。 Content-Type必须是角色的角色相同。
x-amz-acl和节点上的ACL都需要设置为至少public-read
您需要在s3中生成一个存储桶策略,该策略为您的ACCESS_KEY提供权限
它需要是PUT请求[但这是我快速解决的问题]
注意:我创建了一个IAM用户,但后来没有使用它。 IAM用户甚至没有工作。它可以正常使用公钥。