使用预签名 URL 和来自浏览器的 ng-file-upload 将文件上传到 AWS S3 时出现 403 签名不匹配

403 Signature not matched in uploading a file to AWS S3 with Pre-Signed URL and ng-file-upload from Browser

我在 angular 应用程序中使用 ng-file-upload 将文件发送到 AWS-S3。

Upload.http({
  url: '/presignedurl',
  headers : {
    'Content-Type': file.type
  },
  data: file
})

它给我 403 禁止错误说

<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

AWS S3 需要 binary/octet-stream 因此您可以在 JavaScript 中使用 FileReader class 将文件数据转换为 binary/octet-stream

用这个

替换你的代码
var reader = new FileReader();
var xhr = new XMLHttpRequest();

xhr.open("PUT", $scope.url);
reader.onload = function(evt) {
   xhr.send(evt.target.result);
};
reader.readAsArrayBuffer($files[file]);

你可以试试这样的

var config = {
    url: result.signed_request,
    headers: {
        "Content-Type": files[0].type != '' files[0].type : 'application/octet-stream'
    },
    method: 'PUT',
    data: files[0]
};
Upload.http(config);