2010-10-08 162 views
1

,这已经把我扔了太久..CSV下载失败,第一次尝试的Internet Explorer,后续尝试

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

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

  2. 当试图立即访问相同的URL时,下载提示符将成功工作。

  3. 在任何情况下,Cache-Control标头也没有正确发送。我们正在为机架响应提供特定的值,但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 

回答

2

这个问题可能与http://support.microsoft.com/kb/316431 - 尝试省略“必须验证”在头“的Cache-Control”,看看它是否工作。如果不尝试完全省略标题。对于正在发送的“no-cache”部分,请求是否可能要通过代理来添加?

斯文

+0

您好,Rails 3中源花了一些时间后,我们来到了以下结论: 一)设置这种方式是不工作的头,我们需要做的事情一样标题[“的cache b)如果你的响应没有正确地返回一个值,Rails 3会将Cache-Control设置为默认值“no-cache”,如果你的响应没有正确返回,字符串值。这可以是一个字符串数组,也可以是单个形成的字符串。 c)如果你以前在Rails 2.x中使用过程进行响应,而是将其更改为生成过程的类,产生字符串并对每个和所有响应? – releod 2010-10-18 20:32:32

+0

只是为了确认@shendriks的答案。我遇到了完全相同的问题,并且在尝试从Excel或MS Word打开链接时发现相同的问题。通过彻底删除Cache-Control标头,问题解决了。 – 2013-12-10 20:18:08