Ruby on rails 允许用户下载文件
我已经阅读了大量StackOverflow线程和教程,但对于如何允许用户从您的站点下载文件,我还没有找到一个好的、简单的解释 我所要做的就是添加一个链接到我的一个视图,当单击该视图时,该视图将下载一个文件 我想了解:Ruby on rails 允许用户下载文件,ruby-on-rails,Ruby On Rails,我已经阅读了大量StackOverflow线程和教程,但对于如何允许用户从您的站点下载文件,我还没有找到一个好的、简单的解释 我所要做的就是添加一个链接到我的一个视图,当单击该视图时,该视图将下载一个文件 我想了解: 我应该在我的文件系统中将可下载文件存储在哪里公共 在您的视图中链接到文件有什么特别的地方吗,或者它只是一个链接到 在路线中需要发生什么?这只是一个控制器的获取操作 控制器中需要发生什么?在rails文档中,我读到您需要“小心清理来自web页面的path参数”,但我不确定这到底意味
- 我应该在我的文件系统中将可下载文件存储在哪里<代码>公共
- 在您的视图中链接到文件有什么特别的地方吗,或者它只是一个链接到
- 在
路线中需要发生什么?这只是一个
控制器的
操作获取
- 控制器中需要发生什么?在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为下载服务,我们可以应用我们想要的任何访问控制规则 谢谢大家!!(必须满足角色最低要求)谢谢!(必须满足字符最小值)