rails中的文件下载链接
Posted
技术标签:
【中文标题】rails中的文件下载链接【英文标题】:file download link in rails 【发布时间】:2012-10-31 18:04:27 【问题描述】:我想为访问者提供下载一些 pdf 的选项。 我试过了:
<%= link_to "abc", "/data/abc.pdf"%>
<%= link_to "abc", "/data/abc.pdf", :format => 'pdf' %>
还有一些变化,但它们似乎不起作用。我不断收到No route matches [GET] "/data/abc.pdf"
我有一个名为 data 的文件夹中的 pdf 文件,该文件夹位于 assets 文件夹中。 任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:Rails 4:
在路线中:
get "home/download_pdf"
在控制器中(已经有pdf):
def download_pdf
send_file(
"#Rails.root/public/your_file.pdf",
filename: "your_custom_file_name.pdf",
type: "application/pdf"
)
end
在控制器中(需要生成pdf):
require "prawn"
class ClientsController < ApplicationController
def download_pdf
client = Client.find(params[:id])
send_data generate_pdf(client),
filename: "#client.name.pdf",
type: "application/pdf"
end
private
def generate_pdf(client)
Prawn::Document.new do
text client.name, align: :center
text "Address: #client.address"
text "Email: #client.email"
end.render
end
end
在视图中:
<%= link_to 'Download PDF', home_download_pdf_url %>
Rails 3
方法:
def download
send_data pdf,
:filename => "abc.pdf",
:type => "application/pdf"
end
你应该去这个选择
导轨
公用文件夹中的文件
这可能是你的答案:How to download a file from rails application
你应该把你的文件放在公共文件夹中,这是诀窍。
正确放置文件后应该可以工作。
如果您无法将文件移动到公共文件夹,请告诉我。
通过控制器下载
使用下载操作创建一个控制器并link_to
它
def download
send_file '/assets/data/abc.pdf', :type=>"application/pdf", :x_sendfile=>true
end
【讨论】:
那是旧版本的 Rails。因为rails 3(我认为)公用文件夹是资产。 好的,我试过了,它奏效了。我很确定自 rails 3 以来所有资源都应该放在 assets 文件夹中,但既然它工作了,它现在就可以了。谢谢。 抱歉,没有指定您使用的 Rails 版本 检查我刚刚为 Rails 3 所做的新编辑。希望对您有所帮助! 如果这些 pdf 可供所有人使用,则不需要这种方法。使用 Rails 3.1 js,css 和图像被移动到 assets 文件夹(因为预编译),但 public 文件夹仍然有它的目的,就像这个 :)【参考方案2】:导轨 4:
在路线中:
get "home/download_pdf"
在控制器中(已经有pdf):
def download_pdf
send_file(
"#Rails.root/public/your_file.pdf",
filename: "your_custom_file_name.pdf",
type: "application/pdf"
)
end
在控制器中(需要生成pdf):
require "prawn"
class ClientsController < ApplicationController
def download_pdf
client = Client.find(params[:id])
send_data generate_pdf(client),
filename: "#client.name.pdf",
type: "application/pdf"
end
private
def generate_pdf(client)
Prawn::Document.new do
text client.name, align: :center
text "Address: #client.address"
text "Email: #client.email"
end.render
end
end
在视图中:
<%= link_to 'Download PDF', home_download_pdf_url %>
【讨论】:
只需使用 "themed_text" %> 使用路由 url 的好处是,如果文件是作为内联临时文件生成的,则无需依赖文件的特定文件名/路径。 为了进一步澄清,我知道这不是 OP 的问题,但它是一个更笼统的答案 @Navi 我尝试了您的方法,但我不断收到 No route matches 错误。我的目录是 /assets/templates/ 并且在我在控制台中使用 Rails.application.config.assets.paths 时列出,但未在我的公用文件夹中列出。你能在这里看到问题吗? 您将如何针对多个文件进行调整? IE 一个正在生成列表中的链接的文件文件夹【参考方案3】:如果文件是静态的(意味着它们不会更改),请将它们放在公用文件夹中。
然后就可以下载了
<a href="file.pdf" download>PDF</a>
或使用 ERB
<%= link_to 'PDF', 'file.pdf', download: '' %>
要给文件另一个名称以供下载,只需将该名称传递给下载选项
<%= link_to 'PDF', 'file.pdf', download: 'data' %>
这会将文件下载为data.pdf
,而不是file.pdf
。
【讨论】:
【参考方案4】:你可以像这样简单地调用你的控制器动作
<%= link_to "Download", download_file_path, class: "btn btn-sm btn-default", target: "_blank" %>
在你的控制器中
def download_file
redirect_to paperclip_attachment.file.url
end
【讨论】:
这是一个 Rails 项目,所以您需要使用link_to
助手
这个建议是否会导致对答案投反对票,或者只是说张贴者来更新他/她的答案?我认为这种态度不适合像我这样的新手 SO 用户。
只有你想象的态度。只是想帮助新手。该问题也使用了助手,这是在您的答案中使用它的更好理由【参考方案5】:
我努力寻找从公共目录自动下载某些文件的简单方法。 最后我想出了这个解决方案。 例如: 我将我的文件放在公共目录内的 SVG 文件夹中。
Public/svg/Test1.xlsx
现在,当我尝试访问它时,加载它并使用回形针给出路径,它会给出问题。 即使当我尝试完整路径时,它也会出现问题,因此我们可以使其成为动态路径。 首先获取主机的路径,以便可以轻松重定向。
现在我们可以访问公共文件夹中的任何文件,如下所示 和 Pass id 和下载选项。 下载选项重命名您要下载的任何文件。
<%= link_to 'Database File', "#url/svgs/Test1.xlsx", download: 'Data.xlsx',id: "Link_to_Downlaod" %>
现在可点击链接已准备就绪,我们可以点击上面的链接下载文件。 使用以下脚本自动下载文件。
<script type="text/javascript">
window.onload = document.getElementById('Link_to_Downlaod').click();
</script>
</div>
对于 PDF 或任何其他文件类型只需要更改文件扩展名。
【讨论】:
【参考方案6】:对我来说,链接到 pdf 文件的最佳解决方案是通过以下简单步骤:
1- 在公共文件夹中添加您的 pdf 文件
2- `pdf 文件
这里有视频向您详细展示https://www.youtube.com/watch?v=bNZ6FJrZ_lo&t=64s`
【讨论】:
以上是关于rails中的文件下载链接的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4 - 通过使用 AJAX UJS 的集合中的链接更新表