Angularjs 如何在不知道内容类型的情况下生成AWS S3预签名URL请求?
我正在服务器端生成一个带有以下参数的预签名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
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);