【问题标题】:CSV download fails with Internet Explorer on first attempt, works on subsequent attemptsCSV 下载在第一次尝试时使用 Internet Explorer 失败,在后续尝试中有效
【发布时间】:2010-10-08 14:39:10
【问题描述】:

这让我失望了太久了..

下面发布的是我们的 Rails 3 控制器。

  1. 首次尝试使用 Internet Explorer 访问时,下载提示失败并显示“无法下载”消息。

  2. 当尝试访问紧随其后的相同 URL 时,下载提示会成功运行。

  3. 在任何情况下,Cache-Control 标头都未正确发送。我们为 Rack Response 提供了一个特定的值,但 Cache-Control 总是以“Cache-Control: no-cache”的形式返回。但是,提供的其他标头值正在正确发送。这可能是一个单独的问题,但无论如何都会让我失望。

下面的示例模拟了我们的实际系统如何处理客户数据。 CSV 启动并流式传输到客户端。下载是渐进的,以避免在 CSV 生成完成时等待很长时间。这些文件可能超过 20-30mb,因此在下载开始前等待几分钟是不可取的。

这似乎适用于所有其他浏览器(firefox、safari 等)。

class StreamingController < ApplicationController

  def index
    respond_to do |wants|
      wants.csv {
        filename = "testing_filename#{DateTime.now}.csv"

        headers.merge!({
          'Cache-Control'             => 'must-revalidate, post-check=0, pre-check=0',
          'Content-Type'              => 'text/csv',
          'Content-Disposition'       => "attachment; filename=\"#{filename}\"",
          'Content-Transfer-Encoding' => 'binary'
        })

        responder = Rack::Response.new([], 200, headers) do |response|
          response.finish do |r|
            100000.times do |t|
              r.write(t)
            end
          end
        end

        self.response_body = responder
      }
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails internet-explorer csv cache-control


    【解决方案1】:

    这个问题可能与http://support.microsoft.com/kb/316431 有关 - 尝试在标题“Cache-Control”中省略“must-validate”,看看它是否有效。如果不尝试完全省略标题。对于正在发送的“无缓存”部分,请求是否可能通过正在添加它的代理?

    斯文

    【讨论】:

    • 您好,在使用 Rails 3 源代码一段时间后,我们得出以下结论:a) 以这种方式设置标头不起作用,我们需要执行标头["Cache-Control" ] = "must-revalidate, post-check=0, pre-check=0" b) 如果您的响应没有正确返回字符串值,Rails 3 会将 Cache-Control 设置为默认值“no-cache”。这可以是字符串数组,也可以是单个形成的字符串。 c) 如果您之前在 Rails 2.x 中使用 proc 响应,请将其更改为生成 proc、产生字符串并响应每个和所有的类?
    • 只是为了确认@shendriks 的回答。我遇到了完全相同的问题,并且在尝试从 Excel 或 MS Word 打开链接时也发现了同样的问题。通过完全删除 Cache-Control 标头,问题得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多