10

我正在服务器端生成一个预签名的 URL 请求,其中包含 GeneratePresignedUrlRequest 的以下参数bucket、、key和。expiration = 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/png, image/jpeg, text/plain...)。

如何生成一个接受各种类型的预签名 url content-type?我尝试将其设置为 null,它不断发送 403 错误。

谢谢。

4

3 回答 3

6

我刚刚遇到了这个问题,并且刚刚开始工作。将您的 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 标头时,它会推断出它。

于 2015-09-08T18:36:48.677 回答
3

标头中的值Content-Type是签名的必需组成部分。PUT在不知道要发送的值的情况下对 URL进行预签名是不可能的。

POST上传更灵活,因为您可以在签名策略中允许任何 Content-Type 。

于 2015-09-07T22:00:36.483 回答
-1

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

参考:通过javascript获取文档中文件上传的文件名

于 2015-09-07T20:02:09.240 回答