我正在尝试将图片上传到我的S3存储桶。我正在使用AngularJS v1.2.13。
当我使用他们的文档中显示的简单案例(提交带有action
标签的表单)时,一切正常。但是,如果我想这样做,那么使用ng-click
Angular的Angular方式会发送OPTIONS
请求而不是POST
请求。
以下是服务代码,它首先到服务器获取签名(我知道该部分没问题)然后尝试POST所有内容。
myServices.factory('s3', function($http) {
var service = {};
service.upload = function(fileName) {
return $http(
{
method:"POST",
url: "sign",
data: { "fileName": fileName }
}
).then(
function(result) {
// success
//resolve the promise as the data
var data = result.data;
var url = "https://" + data.bucket + ".s3.amazonaws.com/";
return $http.post(url, {
"key": data.key,
"AWSAccessKeyId": data.awsKey,
"acl": data.acl,
"policy": data.policy,
"signature": data.signature,
"Content-Type": "image/jpeg",
"success_action_redirect": "http://localhost:3000/s3Uploaded"
}).then(
function(response) {
// success
console.log("s3.upload, success: ");
console.log(response);
},
function(response) {
// failed
console.log("s3.Upload, fail: ");
console.log(response);
}
);
},
function(response) {
// failed
console.log("s3.sign, fail: ");
console.log(response);
}
);
};
return service;
});
我做错了什么?
答案 0 :(得分:0)
在CORS中的S3标头中添加标题:
Access-Control-Allow-Origin:*
答案 1 :(得分:0)
Angular正在发送预检请求,因此,如果您可以返回第一个计划,请执行此操作!
答案 2 :(得分:0)
服务器将检查您是否应允许在服务器本身上发布一些数据,或者不按照
跨源资源共享策略
那是很正常的,您收到选项请求。 您的ApI服务器应已配置为允许来自您域的请求正常工作。
答案 3 :(得分:0)
您需要将新的CORS Policy配置添加到自己的AWS S3存储桶中
https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/cors.html
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://example.org</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
<ExposeHeader>x-amz-meta-custom-header</ExposeHeader>
</CORSRule>
</CORSConfiguration>