PUT中的签名被拒绝使用预签名URL上传到S3

时间:2015-12-12 00:49:15

标签: javascript jquery ajax amazon-s3 dropzone.js

为什么我可能会从S3 Amazon Pre-Signed Url PUT请求中收到SignatureDoesNotMatch错误?

我正在使用AWS Javascript SDK生成签名的putObject网址,并使用Dropzone.js发布jQuery Ajax PUT请求来管理文件上传。

上传适用于curl -v -T <IMAGE> <PRE-SIGNED-URL>

请求:

// 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>

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。这需要两次修改。我希望有人能更好地解释它们。

第一

我必须在aws-sdk返回的s3 signed url字符串上运行decodeURIComponent()

第二

我必须更改三个并为ajax PUT请求添加两个新选项。

{
  data: file,
  contentType:'image/jpeg',
  dataType:"text",
  cache : false,
  processData : false
}