IE 10 поддерживает CORS. Amazon S3 поддерживает CORS.
Мы загружаем прямую связь с сайтом-S3 во всех браузерах, но IE 10 (не беспокоясь о IE 9-). Он работает следующим образом:
-
Пользователь выбирает файл (перетаскивание или выбор из ввода файла)
-
(POST) Мы должны "подписать" запрос до того, как он перейдет на S3 (
$.post('/static/sign_asset', { ... }
), который имеет обратный вызов, который срабатывает отлично весь день. -
(POST) Затем мы превращаем XHR в S3 с данными файла и данными из подписи и т.д.
var xhr = new XMLHttpRequest(); // etc var fd = new FormData(); // etc xhr.open('POST', url, true); xhr.send(fd);
Загрузка файлов, все работает отлично во всех браузерах, кроме...
Проблемы запускаются в IE 10:
-
Исходный нуль не найден в заголовке Access-Control-Allow-Origin. и XMLHttpRequest: ошибка сети 0x80070005, доступ запрещен. Никакие другие браузеры не отображаются это после того, как мы установили
response.headers["Access-Control-Allow-Origin"] = "*"
в контроллер, который отправляет ответ. Даже если мы ошибались, Chrome покажет эту ошибку, но запрос все равно пройдет. -
Файл фактически загружается на S3, несмотря на эту ошибку. Amazon S3 делает это 303 вещь перенаправления - это наша проверка того, что файл был успешно загружен.
-
(GET) Это перенаправление на запрос CORS Ajax, поэтому "перенаправление" не обновляет страницу, на которую он только что возвращается, и попадает на наши серверы. IE 10 делает этот запрос с Content-Type
multipart/form-data; boundary=---------------------------7dd2ce2201da
Это то, что приводит к ошибке Rails.
Started GET "/static/signed/asset/tsabat/83ee6840-7158-0130-c19b-28cfe912f6ff?bucket=s.cdpn.io&key=5%2Fauthor-tim_2.jpg&etag=%2260fb3876d516553ff6f3a018066b3250%22" for 127.0.0.1 at
2013-03-17 10:46:36 -0700
EOFError - bad content body:
(gem) rack-1.4.5/lib/rack/multipart/parser.rb:74:in `block in Rack::Multipart::Parser#fast_forward_to_first_boundary' (gem) rack-1.4.5/lib/rack/multipart/parser.rb:72:in `Rack::Multipart::Parser#fast_forward_to_first_boundary'
(gem) rack-1.4.5/lib/rack/multipart/parser.rb:72:in `Rack::Multipart::Parser#parse'
(gem) rack-1.4.5/lib/rack/multipart/parser.rb:15:in `Rack::Multipart.parse_multipart'
(gem) rack-1.4.5/lib/rack/multipart.rb:25:in `ActionDispatch::Request#parse_multipart'
(gem) rack-1.4.5/lib/rack/request.rb:336:in `ActionDispatch::Request#POST'
(gem) rack-1.4.5/lib/rack/request.rb:201:in `ActionDispatch::Request#POST'
Сафари тоже не работает (6.0.2)
Safari возвращает код состояния 200, а Rails не беспокоится о перенаправлении, но xhr.status ошибочен. xhr.readyState == 4, но xhr.status == 0. Мы искали 200, чтобы убедиться, что он работает нормально. Это достаточно легко исправить, но все же...
Chrome делает отлично - Кажется, даже не установлен Content-Type
Firefox отлично работает - Content-Type application/json; charset=utf-8
Есть примеры страниц, которые показывают, насколько хорошо IE 10 обрабатывает CORS, но они не занимаются этой проблемой перенаправления.