Javascript 使用签名上载URL从浏览器上载到S3失败
我正试图直接从浏览器上传一个文件到S3。为此,我在我的服务器上生成一个签名上传URL 当我尝试使用从浏览器将文件上载到生成的url时Javascript 使用签名上载URL从浏览器上载到S3失败,javascript,file-upload,browser,amazon-s3,Javascript,File Upload,Browser,Amazon S3,我正试图直接从浏览器上传一个文件到S3。为此,我在我的服务器上生成一个签名上传URL 当我尝试使用从浏览器将文件上载到生成的url时 var xhr = new XMLHttpRequest(); xhr.open('PUT', signedUrl); xhr.send(file); 我得到以下错误 <Error> <Code> SignatureDoesNotMatch </Code> <Message>
var xhr = new XMLHttpRequest();
xhr.open('PUT', signedUrl);
xhr.send(file);
我得到以下错误
<Error>
<Code>
SignatureDoesNotMatch
</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
...
</Error>
我可以通过以下命令使用curl上传到已签名的URL
curl -T <file> -X PUT '<signed-url>'
编辑:
为了清楚起见,我允许所有来源在bucket CORS配置中发送PUT请求。好的,问题是浏览器在请求头中发送内容类型,但没有为内容类型生成签名url。 而不是这个
var params = {
Bucket: bucket,
Key: s3Key,
ACL: "authenticated-read",
Expires: 600
};
S3.getSignedUrl('putObject', params, ...);
是我干的
var params = {
Bucket: bucket,
Key: s3Key,
ACL: "authenticated-read",
Expires: 600,
ContentType: require('mime').lookup(filename)
};
S3.getSignedUrl('putObject', params, ...);
成功了
var params = {
Bucket: bucket,
Key: s3Key,
ACL: "authenticated-read",
Expires: 600,
ContentType: require('mime').lookup(filename)
};
S3.getSignedUrl('putObject', params, ...);