IE10はCORSをサポートしています。AmazonS3はCORSをサポートしています。
サイトからS3への直接アップロードは、IE 10以外のすべてのブラウザーで機能します(IE 9-に煩わされることはありません)。それはこのように動作します:
ユーザーがファイルを選択します(ドラッグアンドドロップまたはファイル入力から選択)
(POST)リクエストがS3()に送られる前に、リクエストに「署名」する必要があります。S3(
$.post('/static/sign_asset', { ... }
)には、一日中完全に起動するコールバックがあります。(POST)次に、ファイルデータや署名などのデータを使用してXHRをS3にします。
var xhr = new XMLHttpRequest(); //など var fd = new FormData(); //など xhr.open('POST'、url、true); xhr.send(fd);
ファイルがアップロードされ、すべてがすべてのブラウザで完全に機能します...
問題はIE10で始まります。
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'
Safariも失敗します(6.0.2)
Safariは200のステータスコードを返し、Railsはリダイレクトについて気が狂うことはありませんが、xhr.statusは間違っています。xhr.readyState == 4、ただしxhr.status==0。正常に機能することを確認するために200を探していました。それは修正するのに十分簡単ですが、それでも...
Chromeは正常に動作します-Content-Typeを設定することすら表示されません
Firefoxは問題ありません-Content-Typeapplication/json; charset=utf-8
IE 10がCORSをどの程度うまく処理できるかを示すサンプルページがありますが、このリダイレクトの問題には対応していません。