Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用预签名URL上传到S3时签名被拒绝_Javascript_Jquery_Ajax_Amazon S3_Dropzone.js - Fatal编程技术网

Javascript 使用预签名URL上传到S3时签名被拒绝

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

为什么我可能从S3 Amazon预签名Url PUT请求中获得
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。