Amazon s3 Javascript- 请求的资源上不存在 'Access-Control-Allow-Origin' header
Amazon s3 Javascript- No 'Access-Control-Allow-Origin' header is present on the requested resource
我正在尝试通过以下方式上传我的文件:
console.log("not broken til here");
scope.inputMemeIsFile=true;
var bucket = new AWS.S3({params: {Bucket: 'townhall.images'}});
file = image.file;
console.log(file);
var params = {Key: file.name, ContentType: file.type, Body: file};
bucket.upload(params, function (err, data) {
var result = err ? 'ERROR!' : 'UPLOADED.';
console.log(result);
console.log(err);
});
但是,出现以下错误:
XMLHttpRequest cannot load https://s3.amazonaws.com/<BUCKETNAME>/favicon.jpg. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access.
程序错误:Network Failure {message: "Network Failure", code: "NetworkingError", time: Tue Feb 17 2015 13:37:06 GMT-0500 (EST), region: "us-east-1", hostname: "s3.amazonaws.com"…
}
我的 CORS 配置如下所示,我已经尝试了一些但没有成功。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
有谁知道出了什么问题吗?我看过 5-6 个类似的帖子,但似乎没有人能够解决问题。
某些浏览器,例如 Chrome,不支持 localhost
或 127.0.0.1
CORS 请求。
尝试改用:http://lvh.me:5000/
有关更多信息,请参阅 。
尝试 <AllowedOrigin>*</AllowedOrigin>
,不使用协议。
如果它没有效果 – 你可能在客户端有问题。
In order to upload files via browser, you should ensure that you have configured CORS for your Amazon S3 bucket and exposed the "ETag" header via the ETag declaration.
我建议您从开放测试配置开始,然后根据您的需要进行修改:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
</CORSRule>
</CORSConfiguration>
然后检查您的存储桶权限和您的 AWS
配置(accessKeyId
、secretAccessKey
和 region
),因为其中 none 存在于您的片段。
为了进行测试,请转到您的 IAM 管理控制台并创建一个名为 prefix-townhall-test
的新 IAM 用户,然后使用这个简单的策略创建一个组来授予对存储桶的访问权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test-bucket-name"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test-bucket-name/*"]
}
]
}
确保您创建的用户正在使用具有此策略的新组。
现在创建一个简单的测试脚本,就像在亚马逊上使用的那样:
HTML
<input id="file-chooser" type="file" />
<button id="upload-button">Upload</button>
<p id="results"></p>
CODE(在 DOM 就绪)
// update credentials
var credentials = {accessKeyId: 'new accessKeyId', secretAccessKey: 'new secretAccessKey'};
AWS.config.update(credentials);
AWS.config.region = 'us-west-1';
// create bucket instance
var bucket = new AWS.S3({params: {Bucket: 'test-bucket-name'}});
var fileChooser = document.getElementById('file-chooser');
var button = document.getElementById('upload-button');
var results = document.getElementById('results');
button.addEventListener('click', function() {
var file = fileChooser.files[0];
if (file) {
results.innerHTML = '';
var params = {Key: file.name, ContentType: file.type, Body: file};
bucket.upload(params, function (err, data) {
results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
});
} else {
results.innerHTML = 'Nothing to upload.';
}
}, false);
您是否尝试过指定来源而不是使用通配符。我很确定我们过去遇到过类似的问题。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://127.0.0.1:5000</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
当前的答案已经过时了。所以这是我的分享:
首先您需要在您的 AWS S3 存储桶上设置 CORS
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"DELETE",
"HEAD"
],
"AllowedOrigins": [
"http://*",
"https://*"
],
"ExposeHeaders": [
"Access-Control-Allow-Origin",
"ETag"
],
"MaxAgeSeconds": 3000
}
]
只是关于 S3 cors 的注释。应用策略时,存储桶中已有的文件不会更新。因此,请确保仅将 CORS 策略应用于新存储桶,或 re-add 应用该策略后的内容。旧内容不会受到新 CORS 政策的影响
amazon S3如何评价CORS?
- 请求的来源header 必须与 AllowedOrigin 元素匹配。
- 请求方法(例如 GET 或 PUT)或 Access-Control-Request-Method header(如果是预检 OPTIONS 请求)必须是 AllowedMethod 元素之一。
- 预检请求中请求的 Access-Control-Request-Headersheader 中列出的每个 header 都必须与 AllowedHeader 元素匹配。
对于最后一步,您还需要清除浏览器上的缓存,因为浏览器可能会缓存之前的 pre-flight 请求
我正在尝试通过以下方式上传我的文件:
console.log("not broken til here");
scope.inputMemeIsFile=true;
var bucket = new AWS.S3({params: {Bucket: 'townhall.images'}});
file = image.file;
console.log(file);
var params = {Key: file.name, ContentType: file.type, Body: file};
bucket.upload(params, function (err, data) {
var result = err ? 'ERROR!' : 'UPLOADED.';
console.log(result);
console.log(err);
});
但是,出现以下错误:
XMLHttpRequest cannot load https://s3.amazonaws.com/<BUCKETNAME>/favicon.jpg. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access.
程序错误:Network Failure {message: "Network Failure", code: "NetworkingError", time: Tue Feb 17 2015 13:37:06 GMT-0500 (EST), region: "us-east-1", hostname: "s3.amazonaws.com"…
}
我的 CORS 配置如下所示,我已经尝试了一些但没有成功。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
有谁知道出了什么问题吗?我看过 5-6 个类似的帖子,但似乎没有人能够解决问题。
某些浏览器,例如 Chrome,不支持 localhost
或 127.0.0.1
CORS 请求。
尝试改用:http://lvh.me:5000/
有关更多信息,请参阅 。
尝试 <AllowedOrigin>*</AllowedOrigin>
,不使用协议。
如果它没有效果 – 你可能在客户端有问题。
In order to upload files via browser, you should ensure that you have configured CORS for your Amazon S3 bucket and exposed the "ETag" header via the ETag declaration.
我建议您从开放测试配置开始,然后根据您的需要进行修改:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
</CORSRule>
</CORSConfiguration>
然后检查您的存储桶权限和您的 AWS
配置(accessKeyId
、secretAccessKey
和 region
),因为其中 none 存在于您的片段。
为了进行测试,请转到您的 IAM 管理控制台并创建一个名为 prefix-townhall-test
的新 IAM 用户,然后使用这个简单的策略创建一个组来授予对存储桶的访问权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test-bucket-name"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test-bucket-name/*"]
}
]
}
确保您创建的用户正在使用具有此策略的新组。
现在创建一个简单的测试脚本,就像在亚马逊上使用的那样:
HTML
<input id="file-chooser" type="file" />
<button id="upload-button">Upload</button>
<p id="results"></p>
CODE(在 DOM 就绪)
// update credentials
var credentials = {accessKeyId: 'new accessKeyId', secretAccessKey: 'new secretAccessKey'};
AWS.config.update(credentials);
AWS.config.region = 'us-west-1';
// create bucket instance
var bucket = new AWS.S3({params: {Bucket: 'test-bucket-name'}});
var fileChooser = document.getElementById('file-chooser');
var button = document.getElementById('upload-button');
var results = document.getElementById('results');
button.addEventListener('click', function() {
var file = fileChooser.files[0];
if (file) {
results.innerHTML = '';
var params = {Key: file.name, ContentType: file.type, Body: file};
bucket.upload(params, function (err, data) {
results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
});
} else {
results.innerHTML = 'Nothing to upload.';
}
}, false);
您是否尝试过指定来源而不是使用通配符。我很确定我们过去遇到过类似的问题。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://127.0.0.1:5000</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
当前的答案已经过时了。所以这是我的分享:
首先您需要在您的 AWS S3 存储桶上设置 CORS
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"DELETE",
"HEAD"
],
"AllowedOrigins": [
"http://*",
"https://*"
],
"ExposeHeaders": [
"Access-Control-Allow-Origin",
"ETag"
],
"MaxAgeSeconds": 3000
}
]
只是关于 S3 cors 的注释。应用策略时,存储桶中已有的文件不会更新。因此,请确保仅将 CORS 策略应用于新存储桶,或 re-add 应用该策略后的内容。旧内容不会受到新 CORS 政策的影响
amazon S3如何评价CORS?
- 请求的来源header 必须与 AllowedOrigin 元素匹配。
- 请求方法(例如 GET 或 PUT)或 Access-Control-Request-Method header(如果是预检 OPTIONS 请求)必须是 AllowedMethod 元素之一。
- 预检请求中请求的 Access-Control-Request-Headersheader 中列出的每个 header 都必须与 AllowedHeader 元素匹配。
对于最后一步,您还需要清除浏览器上的缓存,因为浏览器可能会缓存之前的 pre-flight 请求