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

时间:2013-03-17 20:37:00

标签: amazon-s3 amazon internet-explorer-10 cors

IE 10支持CORS。 Amazon S3支持CORS。

我们在所有浏览器中都有直接从站点到S3的上传工作,但IE 10(没有使用IE 9-)。它的工作原理如下:

  1. 用户选择一个文件(拖放或从文件输入中选择)

  2. (POST)我们必须在请求进入S3($.post('/static/sign_asset', { ... })之前对其进行“签名”,该回复具有一整天都能完美触发的回调。

  3. (POST)我们然后使用文件数据和来自签名的数据将XHR转换为S3。

  4. var xhr = new XMLHttpRequest();
    // etc
    var fd = new FormData();
    // etc
    xhr.open('POST', url, true);
    xhr.send(fd);
    

    文件上传,一切都在所有浏览器中完美运行,除了......

    问题从IE 10开始:

    1. 在Access-Control-Allow-Origin标头中找不到Origin null。 XMLHttpRequest:网络错误0x80070005,访问被拒绝。没有其他浏览器显示在我们在发送响应的控制器中设置response.headers["Access-Control-Allow-Origin"] = "*"之后。即使我们有这个错误,Chrome也会显示此错误,但请求仍然会通过。

    2. 尽管出现此错误,该文件确实会上传到S3。 Amazon S3执行303 redirect thing - 这是我们验证文件是否已成功上传。

    3. (GET)这是对CORS Ajax请求的重定向,因此“重定向”不刷新它刚返回的页面并命中我们的服务器。 IE 10使用a发出此请求 内容类型multipart/form-data; boundary=---------------------------7dd2ce2201da

    4. 这是导致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 - 内容类型application/json; charset=utf-8


      example pages显示IE 10处理CORS的程度,但它们不处理此重定向问题。

1 个答案:

答案 0 :(得分:10)

CodePen团队成员在这里。我们想出来了......

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

对于后代,不要依赖于S3 303的重定向来跨越xhr请求的浏览器一致地工作。如果你这样做,你将花时间对抗无效的标题,无效的原点和龙。