Ruby on rails 在rails应用程序中设置下载文件的文件名

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

我有一个控制器操作,允许用户下载扩展名为.ppt的文件。它不是真正的powerpoint二进制文件,只是powerpoint可以读取的xml格式。该文件是从名为ElementsController的控制器的show action下载的,但实际上并未在控制器中定义show action,但是在app/views/elements/show.ppt.builder中有一个模板文件。我在config/initializers/Mime_types.rb中注册了Mime::Type,如下所示:

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