Ruby on rails 在rails应用程序中设置下载文件的文件名
我有一个控制器操作,允许用户下载扩展名为.ppt的文件。它不是真正的powerpoint二进制文件,只是powerpoint可以读取的xml格式。该文件是从名为ElementsController的控制器的show action下载的,但实际上并未在控制器中定义show action,但是在app/views/elements/show.ppt.builder中有一个模板文件。我在config/initializers/Mime_types.rb中注册了Mime::Type,如下所示:Ruby on rails 在rails应用程序中设置下载文件的文件名,ruby-on-rails,controller,download,Ruby On Rails,Controller,Download,我有一个控制器操作,允许用户下载扩展名为.ppt的文件。它不是真正的powerpoint二进制文件,只是powerpoint可以读取的xml格式。该文件是从名为ElementsController的控制器的show action下载的,但实际上并未在控制器中定义show action,但是在app/views/elements/show.ppt.builder中有一个模板文件。我在config/initializers/Mime_types.rb中注册了Mime::Type,如下所示: Mime
Mime::Type.register“multipart/related”,:ppt
文件可以正确下载,并在windows系统上用powerpoint打开,但问题是文件名。文件名为3.ppt,其中3是url中的id参数。我想知道是否有办法将文件名设置为比3.ppt更具描述性的格式
thx
-C您可以使用:
另一个优点是可以使用x-sendfile,这样当客户端下载数据时,mongrel/thin就不会等待了
另一种选择是采用如下路线: /elements/3/files/foo.ppt 然后,在FileController的show方法中,可以发送id参数的任何内容。一个可能的示例:
def show
@item = Item.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.ppt {
response.headers['Content-Disposition'] = "attachment; filename=\"#{@item.filename}.ppt\""
} # show.ppt.erb
format.xml { render :xml => @item }
end
end
嗯。这是一个非常古老的问题的答案,但对于Rails 3.2来说,最简单的方法是将其设置为:
respond_to do |format|
format.html # index.html.erb
format.json { render json: @product }
format.csv { send_data @product.to_csv, :filename => "New-Product-filename.csv" }
format.xls
end
send_data的问题是,我必须在控制器中打开方法并定义respond_to do | format |,这正是我试图避免的。似乎没有理由在单独的控制器操作中实际将respond_设置为,因为如果您遵循命名约定并注册mime类型,rails会自动为您执行此操作。我只想设置文件名,而不是重新定义整个操作。我想问题是您正在请求一个具有格式的URI。我希望它返回一个具有该名称的文档。你看到我的其他建议了吗?谢谢,这个答案帮助我回答了。
respond_to do |format|
format.html # index.html.erb
format.json { render json: @product }
format.csv { send_data @product.to_csv, :filename => "New-Product-filename.csv" }
format.xls
end