S3: Нет "Access-Control-Allow-Origin" для AJAX POST
Эта проблема вызывает у меня немного орехов. Я пытаюсь загрузить файлы через AJAX POST в ведро S3.
У меня есть все учетные данные правильно, потому что, когда я выполняю обычные HTTP POST, он создает ресурс в ведро S3 просто отлично. Но мне бы очень хотелось загрузить несколько файлов одновременно с индикаторами выполнения, поэтому мне нужен AJAX.
У меня есть установка CORS на моем ведре S3:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://localhost:3000</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Сейчас я просто пытаюсь заставить его работать в моей среде разработки (localhost: 3000, используя стандартный Rails 4.1).
Из моего понимания, приведенное выше правило CORS должно разрешать запросы AJAX с localhost: 3000 в ведро S3.
Однако каждый раз, когда я отправляю файл через AJAX, я получаю следующую ошибку:
XMLHttpRequest cannot load https://s3.amazonaws.com/<BUCKET>. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.
Это не имеет для меня никакого смысла, потому что localhost: 3000 предоставляется доступ через правило CORS.
Я также предоставил фрагмент JS, который я использовал для отправки формы:
$.ajax({
method: "POST",
crossDomain: true,
url: "https://s3.amazonaws.com/<BUCKET>",
data: $(this).serialize() # Contains S3 necessary values
})
Форма имеет входы для ключей Amazon S3/etc. Я знаю, что они работают, потому что, когда я выполняю обычные HTTP POST, он правильно создает актив в S3. Все, что я пытаюсь сделать, это AJAXify процесс.
Я пропустил что-то очевидное здесь?
Использование: Rails 4.1, jquery-file-upload, fog gem (для S3)
Ответы
Ответ 1
вы можете попробовать, изменив
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Ответ 2
Ваш вопрос кажется очень похожим на проблему, с которой я столкнулся, и которая никогда не была должным образом (точно) ответной, и, казалось, была проблемой, связанной с ограничением браузера, а не фактической технологией передачи данных за ней.
Здесь ссылка на мой оригинальный вопрос и ответы, которые я получил здесь на SO:
Почему Microsoft Skydrive не загружает несколько файлов через API?
Надеюсь, это может дать некоторое представление о вашей проблеме и это не просто шум.