Javascript AWS S3 ajax PUT返回';我们计算的请求签名与您提供的签名不匹配';?
我正试图通过预先签名的URL将文件上传到S3。通过使用Javascript AWS S3 ajax PUT返回';我们计算的请求签名与您提供的签名不匹配';?,javascript,amazon-web-services,amazon-s3,Javascript,Amazon Web Services,Amazon S3,我正试图通过预先签名的URL将文件上传到S3。通过使用curl curl --request PUT --upload file {filename} "{url}" 它把它推到上面A-好的 但是,在javascript中尝试时,我收到以下消息: 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法 我已经采取了尽可能多的调试步骤——例如,确保内容类型和内容长度在预签名url和我实际尝试上传的内容之间匹配 我找到了这个,试了里面的所有东西: 我的关键点没有尾随空
curl
curl --request PUT --upload file {filename} "{url}"
它把它推到上面A-好的
但是,在javascript中尝试时,我收到以下消息:
我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法
我已经采取了尽可能多的调试步骤——例如,确保内容类型和内容长度在预签名url和我实际尝试上传的内容之间匹配
我找到了这个,试了里面的所有东西:
- 我的关键点没有尾随空格或斜线
- 我的bucketname没有斜杠
- 尝试对我的密钥进行URL编码--没有区别
- 确保我的keyname是兼容的
创建预签名URL时,您是指定了image/png的内容类型,还是指定了任何内容类型 如果没有,因为您在浏览器上载中包含内容类型,Amazon可能指的签名不匹配是ajax PUT确实有内容类型头,但签名URL上的签名没有 我最近遇到了这个问题,因为我正在使用.NET AWSSDK创建预签名URL,并且在生成URL时没有指定内容类型
从一些普通的示例C#代码上传工作正常,但在我的浏览器应用程序中失败,因为我使用的框架会自动附加内容类型标题,导致不匹配。使用web debbugger(我正在使用)重新播放请求,并从浏览器的请求中删除内容类型标题,这使我找到了导致不匹配的原因。另一个可能的原因是,您的计算机本地时间明显偏离亚马逊的时间。超过一分钟的偏移量会为我触发此错误。在这种情况下,错误消息是不同的。
$(document).ready(function () {
$('[type=submit]').click(function (evt) {
evt.preventDefault();
console.log($('#id_attachment').get(0).files[0].size);
var reader = new FileReader();
reader.onloadend = function (evt) {
console.log(evt.target.result);
$.ajax({
url: 'https://bucketname.s3.amazonaws.com/simple.png?Signature=vYIEOmAay9v6zwB1cz78FhXv6Yo%3D&Expires=1416243285&AWSAccessKeyId=ACCESSKEY',
type: 'PUT',
contentType: "image/png",
data: evt.target.result,
success: function () {
console.log('Uploaded data successfully.');
}
});
};
reader.readAsBinaryString($('#id_attachment').get(0).files[0]);
});
});