15

我有一个控制器操作,允许用户下载扩展名为 .ppt 的文件。它不是真正的 powerpoint 二进制文件,只是 powerpoint 可以读取的 xml-ish 格式。该文件是从名为 ElementsController 的控制器的显示操作中下载的,但显示操作实际上并未在控制器中定义,但是在 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 更具描述性的名称。

谢谢,

-C

4

3 回答 3

25

您可以使用send_data

send_data pptdata, :filename => 'your_file_name.ppt', 
   :disposition => 'inline', :type => "multipart/related"

这样做的另一个优点是您可以使用 x-sendfile,这样您就不会在客户端下载数据时等待。


另一种选择是有如下路线:

/elements/3/files/foo.ppt

然后在 FilesController 的 show 方法中,您可以发送任何 id 参数。

于 2009-03-05T23:02:13.950 回答
15

一个可能的例子:

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
于 2010-10-06T19:07:48.987 回答
5

行。这是一个非常古老的问题的答案,但从 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

源 API 文档

于 2013-05-17T14:24:21.387 回答