amazon-s3 – CORS,Amazon S3和Rails – 在IE 10和Safari上失败

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头中找不到Origin null。和XMLHttpRequest:网络错误0x80303 redirect thing5,访问被拒绝。在我们在发送响应的控制器中设置response.headers [“Access-Control-Allow-Origin”] =“*”之后,没有其他浏览器显示此信息。即使我们有这个错误,Chrome会显示此错误,但请求仍然会通过。
>该文件实际上确实得到上传到S3,尽管这个错误。 Amazon S3的确是303 redirect thing – 这是我们验证文件已成功上传。
>(GET)这是一个CORS Ajax请求的重定向,所以“重定向”不刷新页面,它刚刚回来并击中我们的服务器。 IE 10使用a请求
多部分/表单数据的内容类型; 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 does fine – 甚至不设置Content-Type

Firefox does fine – Content-Type application / json; charset = utf-8

example pages显示了IE 10如何处理CORS,但他们不处理这个重定向问题。

CodePen团队成员在这里。我们想出了这一点…

我们想依赖于303的重定向内置到S3的POST功能,但它被证明是有问题的,如上所示。相反,我们只是停止使用S3 Form Field success_action_redirect并切换到success_action_status。

对于后代,不要依赖S3的303重定向来跨浏览器一致地工作xhr请求。如果你这样做,你会花费你的时间打击无效标题,null起源和龙。

http://stackoverflow.com/questions/15465922/cors-amazon-s3-and-rails-fails-on-ie-10-and-safari

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:amazon-s3 – CORS,Amazon S3和Rails – 在IE 10和Safari上失败