Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_File Upload_Browser_Amazon S3 - Fatal编程技术网

Javascript 使用签名上载URL从浏览器上载到S3失败

Javascript 使用签名上载URL从浏览器上载到S3失败,javascript,file-upload,browser,amazon-s3,Javascript,File Upload,Browser,Amazon S3,我正试图直接从浏览器上传一个文件到S3。为此,我在我的服务器上生成一个签名上传URL 当我尝试使用从浏览器将文件上载到生成的url时 var xhr = new XMLHttpRequest(); xhr.open('PUT', signedUrl); xhr.send(file); 我得到以下错误 <Error> <Code> SignatureDoesNotMatch </Code> <Message>

我正试图直接从浏览器上传一个文件到S3。为此,我在我的服务器上生成一个签名上传URL

当我尝试使用从浏览器将文件上载到生成的url时

var xhr = new XMLHttpRequest();
xhr.open('PUT', signedUrl);     
xhr.send(file);
我得到以下错误

<Error>
  <Code>
    SignatureDoesNotMatch
  </Code>
  <Message>
    The request signature we calculated does not match the signature you provided. Check your key and signing method.
  </Message>
  ...
</Error>
我可以通过以下命令使用curl上传到已签名的URL

curl -T <file> -X PUT '<signed-url>'
编辑:
为了清楚起见,我允许所有来源在bucket CORS配置中发送PUT请求。

好的,问题是浏览器在请求头中发送内容类型,但没有为内容类型生成签名url。 而不是这个

var params = {
    Bucket: bucket, 
    Key: s3Key,
    ACL: "authenticated-read",
    Expires: 600
};
S3.getSignedUrl('putObject', params, ...);
是我干的

var params = {
    Bucket: bucket, 
    Key: s3Key,
    ACL: "authenticated-read",
    Expires: 600,
    ContentType: require('mime').lookup(filename)
};
S3.getSignedUrl('putObject', params, ...);
成功了

var params = {
    Bucket: bucket, 
    Key: s3Key,
    ACL: "authenticated-read",
    Expires: 600,
    ContentType: require('mime').lookup(filename)
};
S3.getSignedUrl('putObject', params, ...);