我在服务器端生成预先签名的网址请求,其中包含以下GeneratePresignedUrlRequest参数:bucket
,key
,expiration = in 1 hour
和method = 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/png
,image/jpeg
,text/plain
...)。
如何生成接受各种content-type
的预签名网址?我尝试将其设置为null,它一直发送403错误。
感谢。
答案 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