Angularjs 如何在不知道内容类型的情况下生成AWS S3预签名URL请求?

Angularjs 如何在不知道内容类型的情况下生成AWS S3预签名URL请求?,angularjs,amazon-web-services,amazon-s3,pre-signed-url,Angularjs,Amazon Web Services,Amazon S3,Pre Signed Url,我正在服务器端生成一个带有以下参数的预签名URL请求:bucket、key、expiration=in 1h和method=PUT 在我的Angular应用程序中,我使用 问题是我总是有一个403响应,除非我在GeneratePresignedUrlRequest.contentType中设置了文件的类型 问题是我无法预先预测用户将选择什么类型的文件(image/png,image/jpeg,text/plain) 如何生成接受各种内容类型的预签名url?我尝试将其设置为null,但它一直发送4

我正在服务器端生成一个带有以下参数的预签名URL请求:
bucket
key
expiration=in 1h
method=PUT

在我的Angular应用程序中,我使用

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

问题是我无法预先预测用户将选择什么类型的文件(
image/png
image/jpeg
text/plain

如何生成接受各种
内容类型的预签名url
?我尝试将其设置为null,但它一直发送403个错误


谢谢。

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


Ref:

来自
内容类型
标题的值是签名的必需组件。在不知道将要发送的值的情况下,无法对
PUT
URL进行预签名


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

我刚刚遇到了这个问题,刚刚开始工作。将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正在寻找一种特定的内容类型(
binary/octet-stream
),当您省略内容类型头时,它就会推断出这种类型

你所说的
POST
upload是什么意思?使用
POST
、无内容类型和
POST
而不是
PUT
在我的Angular应用程序中获取预签名URL?如何从后端获得授权并不重要,但是S3使用浏览器中的
POST
进行基于表单的上传时有一个非常不同的界面,它似乎更适合您所做的事情,至少在这个意义上是这样的:实际上,您可以从这里开始:谢谢,但我不能使用HTML POST表单。表单需要独立。从技术上讲,您不必“使用”(构建、呈现或显示)表单,只需将表单的结构提交回S3。这并没有解决问题的核心部分:无法提前预测文件类型
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);