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 的集合中的链接更新表

rails 从公共文件夹下载文件

Ruby on Rails AJAX文件上传

rails从公共文件夹下载文件

如何将 Rails 环境变量放在 apple-app-site-association 文件中以获取通用链接?

如何在 rails 6/webpacker 中引用 scss 文件路径?