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,不支持 localhost127.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 配置(accessKeyIdsecretAccessKeyregion),因为其中 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 请求