从目录下载特定文件

时间:2012-07-12 19:20:22

标签: ruby-on-rails

我有一个包含一堆csv文件的文件夹,我想让用户下载他们需要的任何一个。唯一的问题是每天都会创建新文件,所以我不能只在文件名中进行硬编码。我想知道是否有可能以某种方式从视图传递参数到控制器以允许请求下载的文件,但我做的任何事情似乎都没有...

控制器:

def download_file(file_to_download)
  send_file RAILS_ROOT + "/public/csv/" + file_to_download,
    :type => 'text/csv; charset=iso-8859-1; header=present',
    :disposition => "attachment; filename=#{file_to_download}",
    :stream => true,
    :buffer_size => 4096
end

观点:(使用haml)

%h1 Database Export
%h2 Date: #{Date.today}
%table
  %tr
    %td Click on a file to download
    - @files = Dir.glob("public/csv/*.csv")
    - for file in @files
      - name = File.basename(file, '.csv')
      %tr
        %td= link_to name, :controller => "csv_exports", :action => "download_file", :file_to_download => name + ".csv"

我收到错误:参数数量错误(0表示1)

然而,我的请求参数似乎正在传递我想要使用的内容:{“file_to_download”=>“property_site_views_07-12-2012.csv”}

感谢您的帮助!!!

1 个答案:

答案 0 :(得分:0)

rails控制器方法不应该带参数。

您需要通过params选项访问您的请求参数:

def download_file
  file_to_download = params[:file_to_download]
  send_file RAILS_ROOT + "/public/csv/" + file_to_download,
    :type => 'text/csv; charset=iso-8859-1; header=present',
    :disposition => "attachment; filename=#{file_to_download}",
    :stream => true,
    :buffer_size => 4096
end

然而,通过用户提交的这样的值被认为是一种不好的做法,因为它允许注射。您应该验证提交的文件名是否实际上是该特定目录中文件列表中的文件名。

查看有关控制器上更多信息的指南:http://guides.rubyonrails.org/action_controller_overview.html