我使用的是Rails 3.1.0。rc8和Chromium . 15.0.874.102.
我想设置CSV文件下载的文件名。我遵循这个SO解决方案,但发现自己无法修改Content-Disposition
头的filename
。
module ActionController
module CSVHelper
def render_csv options={}
if request.env['HTTP_USER_AGENT'] =~ /msie/i
headers['Pragma'] = "public"
headers['Content-Type'] = "text/plain"
headers['Cache-Control'] = "no-cache, must-revalidate, post-check=0, pre-check=0"
headers['Expires'] = "0"
else
headers['Content-Type'] = "text/csv"
end
filename = generate_filename options.delete(:basename)
headers['Content-Disposition'] = "attachment; filename=#{filename}"
end
def generate_filename basename=nil, suffix="csv"
filename = basename || params[:action]
filename << ".#{suffix}"
filename
end
end
end
在我的控制器中:
respond_to do |format|
format.html
format.csv do
render_csv(:basename => "my_filename")
Rails.logger.debug "HEADERS: #{headers.to_s}"
end
end
在我的日志中:
[2011-11-28 12:25:49.611] DEBUG - HEADERS: {"Content-Type"=>"text/csv", "Content-Disposition"=>"attachment; filename=my_filename.csv"}
在Chromium网络检查器工具中,我在我的响应头中看到以下内容:
Content-Type: text/plain
Content-Disposition: attachment; filename=index.csv
如果我将Content-Type
更改为foo/bar
之类的东西,我可以在网络检查工具中看到更改。无论我将filename
设置为什么,它仍然是index.csv
。
谢谢,马克斯
根据HTTP/1.1规范附录的Content-Disposition部分,文件名必须是一个引号字符串:
因此,您可能需要做以下更改(注意引号):filename-parm = "filename" "=" quoted-string ...
例如
Content-Disposition: attachment; filename="fname.ext"
headers['Content-Disposition'] = "attachment; filename="#{filename}""
我发现我的团队正在使用csv_builder gem,它允许您通过在控制器中设置@filename
来调整下载文件的名称。对于任何能够解释为什么我得到op中描述的行为的人,我仍然会奖励正确答案。
我个人不使用render
来处理这类内容,我更喜欢使用send_data
。下面是一个例子:
send_data data, :type => 'text/csv', :disposition => 'attachment; filename=my_file_name.csv'
我不知道你实际上在哪里发送/渲染输出…是。csv格式吗。动词文件之类的?或者使用csv_builder作为其他答案?这可能就是诀窍。
我想出了同样的事情渲染。xlsx输出。一旦我把文件放到磁盘上,我可以这样做:
def example
respond_to do |format|
format.xlsx do
path = some_method_generating_xlsx_file
headers['Content-Disposition'] = "attachment; filename=test.xlsx"
render :text => File.binread(path), :content_type => XLSX_MIME_TYPE
end
end
end
在我的控制器中,它工作得很好。也许头文件被模板渲染破坏了