【问题标题】:How to download a file from rails application如何从 Rails 应用程序下载文件
【发布时间】:2011-09-17 12:47:03
【问题描述】:

我似乎在任何地方都找不到这个问题的简单而明确的答案!一切似乎都已过时或不完整!

我只是希望用户能够单击链接或按钮并下载文件(位于公共文件夹中的某处)

我试过了:

#view
<%= link_to "Raw blast output" ,:action => :download, :file_name => "public/data/02_blastout/#{@bl_file}" %>
#controller
def download
    send_file "#{RAILS_ROOT}/#{params[:file_name]}"
end

但我收到此错误:

No route matches {:action=>"download", :file_name=>"public/data/02_blastout/input0.fa_x_Glyma1aaunq.bl", :controller=>"cvits"}

感谢您的帮助!

【问题讨论】:

  • 这似乎是一种非常不安全的处理方式,尤其是考虑到您可以直接链接到文件。
  • @Andrew - 使用什么?我已经在使用 send_file 方法了。
  • 有人可以像这样编辑您的链接:?file_name=config/database.yml
  • 我很高兴听到用户获取文件的“正确方法”!!!接受任何建议!

标签: ruby-on-rails view download


【解决方案1】:

不要将send_file 与用户设置的参数一起使用。这打开了一个巨大的安全漏洞,允许用户访问您的应用程序可读的任何文件(即,您的整个应用程序,也可能是文件系统上的其他文件)。

相反,如果文件处于公开状态,则链接到文件本身。在你的情况下:

<%= link_to "Raw blast output", "/data/02_blastout/#{@bl_file}" %>

不需要特殊的控制器动作。

【讨论】:

  • 下载不会锁定rails进程吗?下载不应该由 http 服务器(apache 等)处理,如:therailsway.com/2009/2/22/file-downloads-done-right
  • 如果您设置了 apache 或其他服务器,它应该可以处理。这只是链接的代码。
  • 如果不是公开文件怎么办?而且只供注册用户使用?
  • 马里奥的观点很好。但是可以检查该文件是否位于预期是可下载内容目录的特定目录中,或者该文件是否已在可下载文件表中注册。没有?
猜你喜欢
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多