Javascript 使用预签名URL上传到S3时签名被拒绝
为什么我可能从S3 Amazon预签名Url PUT请求中获得Javascript 使用预签名URL上传到S3时签名被拒绝,javascript,jquery,ajax,amazon-s3,dropzone.js,Javascript,Jquery,Ajax,Amazon S3,Dropzone.js,为什么我可能从S3 Amazon预签名Url PUT请求中获得SignatureDesNotMatch错误 我正在使用AWS Javascript SDK生成已签名的putObjecturl,并使用Dropzone.js通过jQuery Ajax PUT请求发布文件上传 上传使用curl-v-T 请求: // Send uploads to s3 signed urls. // @param res [Object] of signed-url's for image files. funct
SignatureDesNotMatch
错误
我正在使用AWS Javascript SDK生成已签名的putObject
url,并使用Dropzone.js通过jQuery Ajax PUT请求发布文件上传
上传使用curl-v-T
请求:
// Send uploads to s3 signed urls.
// @param res [Object] of signed-url's for image files.
function sendFiles(res){
res.forEach(function(signedUrl){
// Get file for associated Dropzone queued file.
var file = returnFile(signedUrl.options.id);
// signedUrl.url returns:
// https://bucket.s3-us-west-1.amazonaws.com/path/(key:filename)Type=image%2Fjpeg&Expires=1449874843&Signature=####&x-amz-acl=public-read-write`
$.ajax({
url: signedUrl.url,
type: 'PUT',
data: file.upload,
contentType:'multipart/form',
dataType: 'json',
complete:function(data){
console.log("Done", data);
},
error:function(data){
console.log("Error", data);
}
});
});
}
答复:
<Code>
SignatureDoesNotMatch
</Code>
<Message>
The request signature we calculated does not match the signature you provided.
Check your key and signing method.
</Message>
我找到了解决方案。这需要两次修改。我希望有人能更好地解释
首先 我必须对aws sdk返回的s3签名url字符串运行
decodeURIComponent()
第二
我不得不更改三个选项,并在ajax PUT请求中添加两个新选项
{
data: file,
contentType:'image/jpeg',
dataType:"text",
cache : false,
processData : false
}
我一直有这个问题,直到我意识到预签名的URL需要进行URL解码。。。(?)@Julian有趣的是,我正在读一篇关于你的
URLDecodeFormat()
建议的文章。确实这是可能的,我会试试。对你的建议感觉很好。RFC 3986表示无法转义-
字符,我正在使用uuid v4签名作为我的密钥9d8bd4d6-9293-4432-a3f5-fa7119c3d493
,该签名当前以9d8bd4d6%2929293%24432%2a3f5%2fa7119c3d493
的形式发送,不幸的是,它没有起作用。我从uuid字符串中去掉了-
字符,并在其上运行了decodeURIComponent(url)
,因为这是javascript。