0

我有一个包含一堆 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"}

谢谢你的帮助!!!

4

1 回答 1

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

于 2012-07-12T19:58:18.623 回答