Ruby on rails 允许用户下载文件

Ruby on rails 允许用户下载文件,ruby-on-rails,Ruby On Rails,我已经阅读了大量StackOverflow线程和教程,但对于如何允许用户从您的站点下载文件,我还没有找到一个好的、简单的解释 我所要做的就是添加一个链接到我的一个视图,当单击该视图时,该视图将下载一个文件 我想了解: 我应该在我的文件系统中将可下载文件存储在哪里公共 在您的视图中链接到文件有什么特别的地方吗,或者它只是一个链接到 在路线中需要发生什么?这只是一个控制器的获取操作 控制器中需要发生什么?在rails文档中,我读到您需要“小心清理来自web页面的path参数”,但我不确定这到底意味

我已经阅读了大量StackOverflow线程和教程,但对于如何允许用户从您的站点下载文件,我还没有找到一个好的、简单的解释

我所要做的就是添加一个链接到我的一个视图,当单击该视图时,该视图将下载一个文件

我想了解:

  • 我应该在我的文件系统中将可下载文件存储在哪里<代码>公共
  • 在您的视图中链接到文件有什么特别的地方吗,或者它只是一个链接到
  • 路线中需要发生什么?这只是一个
    控制器的
    获取
    操作
  • 控制器中需要发生什么?在rails文档中,我读到您需要“小心清理来自web页面的path参数”,但我不确定这到底意味着什么

谢谢

指向
链接与任何其他链接相同

如果您想将其公开存储,那么可以在任何控制器操作中执行此操作

send_file File.join(Rails.root, 'public', 'file.extension')
您可以创建一个下载控制器并在索引中指定,然后简单地
链接到'Download',下载索引路径
或诸如此类


如果您试图发送用户输入的文件名,则必须对其进行清理。如果它像上面的例子一样是“硬编码”的,那么你就可以了。

指向
链接与任何其他链接相同

如果您想将其公开存储,那么可以在任何控制器操作中执行此操作

send_file File.join(Rails.root, 'public', 'file.extension')
您可以创建一个下载控制器并在索引中指定,然后简单地
链接到'Download',下载索引路径
或诸如此类


如果您试图发送用户输入的文件名,则必须对其进行清理。如果像上面的例子一样是“硬编码”的,那么您就可以了。

在简单的场景中,您不需要控制器来下载文件。只需将文件保存到
public
文件夹。公用文件夹是静态资源的默认文件夹,其中存储有编译的js、css、图像文件、robot.txt等

如果您有文件
月报.doc
。把它放到
公共/reports/monthly report.doc


在查看
链接到'Donwload Report'、'/reports/monthly Report.doc'

的简单场景中,您不需要控制器下载文件。只需将文件保存到
public
文件夹。公用文件夹是静态资源的默认文件夹,其中存储有编译的js、css、图像文件、robot.txt等

如果您有文件
月报.doc
。把它放到
公共/reports/monthly report.doc


在视图
链接到'Donwload Report','/reports/monthly Report.doc'

中,基本上有两种情况:

1.该文件是公开的,任何人都可以下载。 将其放在
/public
目录中。请记住,这是web根目录-因此,如果您有一个位于
/public/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
#routes.rb
资源:下载,仅限:[:show]
类下载控制器<应用程序控制器
#在这里执行身份验证逻辑
#获取/下载/:id
#@example
#GET/downloads/foo.bar将下载存储在
#/downloads/foo.bar
#@raise[ActiveRecord::RecordNotFound],如果文件不存在。
#这将导致呈现404页。
def秀
fn=Rails.root.join('downloads',params[:id])
引发ActiveRecord::RecordNotFound并返回,除非file.exists?(fn)
发送文件(fn)
结束
结束

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

基本上有两种情况:

1.该文件是公开的,任何人都可以下载。 将其放在
/public
目录中。请记住,这是web根目录-因此,如果您有一个位于
/public/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
#routes.rb
资源:下载,仅限:[:show]
类下载控制器<应用程序控制器
#在这里执行身份验证逻辑
#获取/下载/:id
#@example
#GET/downloads/foo.bar将下载存储在
#/downloads/foo.bar
#@raise[ActiveRecord::RecordNotFound],如果文件不存在。
#这将导致呈现404页。
def秀
fn=Rails.root.join('downloads',params[:id])
引发ActiveRecord::RecordNotFound并返回,除非file.exists?(fn)
发送文件(fn)
结束
结束
通过使用Rails为下载服务,我们可以应用我们想要的任何访问控制规则

谢谢大家!!(必须满足角色最低要求)谢谢!(必须满足字符最小值)