Javascript AWS S3 ajax PUT返回';我们计算的请求签名与您提供的签名不匹配';?

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和我实际尝试上传的内容之间匹配 我找到了这个,试了里面的所有东西: 我的关键点没有尾随空

我正试图通过预先签名的URL将文件上传到S3。通过使用
curl

curl --request PUT --upload file {filename} "{url}"
它把它推到上面A-好的

但是,在javascript中尝试时,我收到以下消息:

我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法

我已经采取了尽可能多的调试步骤——例如,确保内容类型和内容长度在预签名url和我实际尝试上传的内容之间匹配

我找到了这个,试了里面的所有东西:

  • 我的关键点没有尾随空格或斜线
  • 我的bucketname没有斜杠
  • 尝试对我的密钥进行URL编码--没有区别
  • 确保我的keyname是兼容的
所以,我有点不知所措。是否有人能确定是什么导致S3拒绝此请求

Javascript:
创建预签名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]);

            });


        });