web-dev-qa-db-ja.com

ファイルダウンロードリンクrails

訪問者にPDFをダウンロードするオプションを提供したいと思います。私が試してみました:

<%= link_to "abc", "/data/abc.pdf"%>

<%= link_to "abc", "/data/abc.pdf", :format => 'pdf' %>

いくつかのバリエーションがありますが、機能していないようです。 No route matches [GET] "/data/abc.pdf"

Pdfファイルは、assetsフォルダーにあるdataというフォルダーにあります。任意の助けをいただければ幸いです。

61
Ionut Hulub

レール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 application

ファイルをパブリックフォルダーに配置する必要があります。これがトリックです。

ファイルが正しく配置されると機能するはずです。

ファイルをパブリックフォルダーに移動できない場合はお知らせください。

コントローラ経由でダウンロード

Downlaodアクションとlink_to itを使用してコントローラーを作成します

  def download
    send_file '/assets/data/abc.pdf', :type=>"application/pdf", :x_sendfile=>true
  end
70
felipeclopes

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 %>
74
rusllonrails

ファイルが静的である(変更されないことを意味する)場合は、パブリックフォルダーに配置します。

その後、次のようにダウンロードできます

<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としてダウンロードされます。

17
Cruz Nunez

このようにコントローラーアクションを呼び出すことができます

<%= link_to "Download", download_file_path, class: "btn btn-sm btn-default", target: "_blank" %>

そしてあなたのコントローラーで

def download_file
 redirect_to Paperclip_attachment.file.url
end

パブリックディレクトリから一部のファイルを自動ダウンロードする簡単な方法を見つけるのに苦労しています。最後に、このソリューションを思いつきます。例:iパブリックディレクトリ内の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またはその他のファイルタイプの場合、ファイル拡張子を変更するだけで済みます。

1