允许用户下载文件

时间:2017-01-14 20:00:06

标签: ruby-on-rails

我已经阅读了大量的StackOverflow主题和教程,而且我还没有找到一个好的,简单的解释,了解如何允许用户从您的文件中下载文件站点。

我想要做的就是添加一个链接到我的一个视图,点击后下载文件。

我想明白:

  • 在哪里可以将可下载文件存储在我的文件系统中? public
  • 在您的视图中链接到该文件有什么特别之处,或者只是link_to
  • routes需要做些什么?它只是get的{​​{1}}?
  • 控制器需要做什么?在rails文档中,我已经读过你需要小心清理路径参数,如果它来自网页,"但我不确定这意味着什么。

谢谢!

3 个答案:

答案 0 :(得分:2)

在简单的场景中,您不需要控制器来下载文件。只需将文件保存到const size_t n = q.size(); for (size_t i = 0; i < n; ++i) std::cout << q.dequeue() << std::endl; 文件夹即可。公用文件夹是静态资源的默认文件夹,存储有编译的js,css,图像文件,robot.txt等。

如果您有文件public。把它放到monthly-report.doc

在视图public/reports/monthly-report.doc

答案 1 :(得分:1)

基本上有两种情况:

1。该文件是公开的,任何人都可以下载。

将其放在/public目录中。请注意,这是网络根目录 - 因此,如果您的文件位于/public/foo/bar.baz,则会使用<%= link_to 'A file', '/foo/bar.baz' %>链接到该文件。

不需要路由或控制器,因为我们只是从服务器公共目录提供静态文件。

2。该文件需要访问控制

在此示例中,我们动态地为/downloads中存储的文件提供服务。

# routes.rb
resources :downloads, only: [:show]

class DownloadsController < ApplicationController
  # do your authentication logic here

  # GET /downloads/:id
  # @example
  #  GET /downloads/foo.bar would download a file stored at
  #  /downloads/foo.bar
  # @raise [ActiveRecord::RecordNotFound] if the file does not exist.
  #   This causes a 404 page to be rendered.
  def show
    fn = Rails.root.join('downloads', params[:id])
    raise ActiveRecord::RecordNotFound and return unless file.exists?(fn) 
    send_file(fn)
  end
end

通过使用Rails提供下载服务,我们可以应用我们想要的任何访问控制规则。

答案 2 :(得分:0)

link_to与任何其他链接相同。

如果您想将其存储在公共场所,请在您想要的任何控制器操作中执行此操作。

send_file File.join(Rails.root, 'public', 'file.extension')

您可以创建一个下载控制器并在索引中指定,然后只需link_to 'Download', download_index_path等。

如果您尝试发送用户输入的文件名,则必须对其进行清理。如果它&#34;硬编码&#34;就像上面的例子一样,那你很好。