66

我想为访问者提供下载一些 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 文件夹中。任何帮助,将不胜感激。

4

6 回答 6

86

导轨 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 %>

导轨 3

这样做的方法:

def download
  send_data pdf,
    :filename => "abc.pdf",
    :type => "application/pdf"
end

你应该去这个选择

导轨 < 3

公共文件夹中的文件

这可能是您的答案:如何从 Rails 应用程序下载文件

您应该将文件放在公用文件夹中,这就是诀窍。

正确放置文件时应该可以工作。

如果您无法将文件移动到公用文件夹,请告诉我。

通过控制器下载

创建一个具有下载操作的控制器,link_to

  def download
    send_file '/assets/data/abc.pdf', :type=>"application/pdf", :x_sendfile=>true
  end
于 2012-10-31T18:13:46.397 回答
77

导轨 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 %>
于 2013-12-25T09:10:09.817 回答
23

如果文件是静态的(意味着它们不会更改),请将它们放在公用文件夹中。

然后你可以下载喜欢

<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.

于 2016-07-11T19:54:07.297 回答
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
于 2016-02-15T14:19:47.443 回答
1

我努力寻找从公共目录自动下载某些文件的简单方法。最后我想出了这个解决方案。例如:我将我的文件放在公共目录内的 SVG 文件夹中。

Public/svg/Test1.xlsx

现在,当我尝试访问它时,它会加载它并使用回形针给出路径,它会给出问题。即使当我尝试完整路径时,它也会出现问题,因此我们可以使其成为动态路径。首先获取主机的路径,以便可以轻松重定向。<% url = request.original_url.chomp(request.fullpath) %>

现在我们可以访问公共文件夹中的任何文件,如下所示并通过 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 或任何其他文件类型,只需更改文件扩展名。

于 2018-04-10T13:12:30.450 回答
1

对我来说,链接到 pdf 文件的最佳解决方案是通过以下简单步骤:

1-将您的pdf文件添加到公共文件夹中

2- `<%= link_to "/nameofthefile.pdf",target: "_blank" do %>pdf 文件<% end %>

这是通过详细信息向您展示的视频https://www.youtube.com/watch?v=bNZ6FJrZ_lo&t=64s `

于 2020-04-16T17:19:33.110 回答