如何在不知道Content-Type的情况下生成AWS S3预先签名的URL请求?

时间:2015-09-07 16:56:07

标签: angularjs amazon-web-services amazon-s3 pre-signed-url

我在服务器端生成预先签名的网址请求,其中包含以下GeneratePresignedUrlRequest参数:bucketkeyexpiration = in 1 hourmethod = PUT

在我的Angular应用中,我使用ng-file-upload

上传文件
Upload.http({
    url: $scope.signedUrl,
    method: "PUT",
    headers : {
        'Content-Type': $scope.file.type
    },
    data: $scope.file
});

问题是我总是有403响应,除非我在GeneratePresignedUrlRequest.contentType中设置文件的类型。

问题在于我无法提前预测用户将选择哪种类型的文件(image/pngimage/jpegtext/plain ...)。

如何生成接受各种content-type的预签名网址?我尝试将其设置为null,它一直发送403错误。

感谢。

3 个答案:

答案 0 :(得分:2)

Content-Type标头中的值是签名的必需组件。在不知道将要发送的值的情况下,无法预先签署PUT网址。

POST上传更灵活,因为您可以在签名的政策中允许任何内容类型。

答案 1 :(得分:1)

我刚遇到这个问题,然后就开始了。用以下内容替换Upload.http代码:

var reader = new FileReader();
var xhr = new XMLHttpRequest();

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

问题最终是S3正在寻找特定的Content-Type(binary/octet-stream),当您省略Content-Type标头时它会推断出来。

答案 2 :(得分:0)

一种可能的解决方案可能是您跟踪扩展名吗? 例如:以“.jpg”结尾 - > content type =“image / jpeg”,以“.zip”结尾 - > content type =“application / octet-stream”。

参考:get the filename of a fileupload in a document through javascript