Заголовок Amason s3 Javascript-No 'Access-Control-Allow-Origin' присутствует на запрошенном ресурсе

Я пытаюсь загрузить файл через:

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.

с продолжениемError: 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"…}

Конфигурация My 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 подобных сообщений, но никто, кажется, не в состоянии решить проблему.

Ответ 1

Чтобы загрузить файлы через браузер, вы должны убедиться, что вы сконфигурировали CORS для своего ведра Amazon S3 и открыли заголовок ETag через декларацию ETag.

Я предлагаю вам начать с открытой тестовой конфигурации, а затем изменить ее на ваши потребности:

<?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), поскольку ни один из них не присутствует в вашем фрагменте.

Для тестирования перейдите в свою консоль управления IAM и создайте нового пользователя IAM с именем prefix-townhall-test, затем создайте группу с помощью этой простой политики, которая предоставляет доступ к ведру:

{
  "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/*"]
    }
  ]
}

Убедитесь, что созданный вами пользователь использует новую группу с этой политикой.

Теперь создайте простой тест script, подобный используемому на amazon:

HTML

<input id="file-chooser" type="file" />
<button id="upload-button">Upload</button>
<p id="results"></p>

КОД (при готовности 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);

Ответ 2

Некоторые браузеры, такие как Chrome, не поддерживают localhost или 127.0.0.1 для запросов CORS.

Попробуйте использовать вместо этого: http://lvh.me:5000/

Подробнее см. fooobar.com/questions/83966/....

Ответ 3

Попробуйте <AllowedOrigin>*</AllowedOrigin>, без протокола.

Если это не действует, вероятно, у вас проблемы на стороне клиента.

Ответ 4

Попробовали ли вы указать свое происхождение, а не использовать подстановочный знак. Я уверен, что у нас были аналогичные проблемы в прошлом.

<?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>