【问题标题】:setting the filename for a downloaded file in a rails application在 Rails 应用程序中设置下载文件的文件名
【发布时间】:2023-03-30 22:23:01
【问题描述】:

我有一个控制器操作,允许用户下载扩展名为 .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

【问题讨论】:

    标签: ruby-on-rails controller download


    【解决方案1】:

    你可以使用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 参数。

    【讨论】:

    • send_data 的问题是我必须在控制器中打开方法并定义respond_to do |format|,这是我试图避免的。
    • 似乎没有理由在您的各个控制器操作中实际设置 respond_to,因为如果您遵循命名约定并注册您的 mime 类型,rails 会自动为您设置。我只想设置文件名,而不是重新定义整个动作。
    • 我想问题是您正在请求具有格式的 URI。我希望它返回一个具有该名称的文档。你看到我的其他建议了吗?
    【解决方案2】:

    一个可能的例子:

    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
    

    【讨论】:

    【解决方案3】:

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

    Source API Doc

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多