file download link in rails

Ruby on-RailsRuby on-Rails-3HyperlinkDownloadLink To

Ruby on-Rails Problem Overview


I would like to give visitors the option to download some pdf. I have tried:

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

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

and some variations but they don't seem to work. I keep getting No route matches [GET] "/data/abc.pdf"

I have the pdf files in a folder called data, located in the assets folder. Any help would be appreciated.

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

Rails 4:

in routes:

get "home/download_pdf"

in controller (already have pdf):

def download_pdf
  send_file(
    "#{Rails.root}/public/your_file.pdf",
    filename: "your_custom_file_name.pdf",
    type: "application/pdf"
  )
end

in controller (need to generate 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

in view:

<%= link_to 'Download PDF', home_download_pdf_url %>

Rails 3

The way to do it:

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

You should go to this alternative

Rails < 3

File in public folder

This may the the answer to you: How to download a file from rails application

You should place your file in public folder, that is the trick.

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

Should work when the file is placed correctly.

Let me know if you can't move your file to public folder.

Download via controller

Create a controller with a downlaod action and link_to it

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

Solution 2 - Ruby on-Rails

Rails 4:

in routes:

get "home/download_pdf"

in controller (already have pdf):

def download_pdf
  send_file(
    "#{Rails.root}/public/your_file.pdf",
    filename: "your_custom_file_name.pdf",
    type: "application/pdf"
  )
end

in controller (need to generate 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

in view:

<%= link_to 'Download PDF', home_download_pdf_url %>

Solution 3 - Ruby on-Rails

If the files are static (meaning they don't change), place them in the public folder.

Then you can download like

<a href="file.pdf" download>PDF</a>

or with ERB

<%= link_to 'PDF', 'file.pdf', download: '' %>

and to give the file another name for downloading, just pass that name to the download option

<%= link_to 'PDF', 'file.pdf', download: 'data' %>

This will download the file as data.pdf instead of file.pdf.

Solution 4 - Ruby on-Rails

you can simply call your controller action like this

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

and in your controller

def download_file
 redirect_to paperclip_attachment.file.url
end

Solution 5 - Ruby on-Rails

I Struggle a lot to find simple way to Auto Downlaod Some File From Public Directory. Finally i come up with this solution. For Example: i Have my file in SVG folder inside Public Directory.

Public/svg/Test1.xlsx

Now When i try to Access it load it and Give Path with Paper clip it give issue. Even When i try full path it give issue as well so we can make it dynamic path. First Get Path of the Host so that Can Redirect Easily. <% url = request.original_url.chomp(request.fullpath) %>

Now we Can Access any file in Public Folder Like below and Pass id and Download option. Download option rename any file which u want to download.

<%= link_to 'Database File', "#{url}/svgs/Test1.xlsx", download: 'Data.xlsx',id: "Link_to_Downlaod" %>

Now Click able link is Ready We Can Click on Above link to Download the File. Use the Following Script to Auto Download the File.

  <script type="text/javascript">
    window.onload = document.getElementById('Link_to_Downlaod').click();
  </script>
</div>

For the Case of PDF or any Any other file type just need to change the file extension.

Solution 6 - Ruby on-Rails

For me the best solution to link to a pdf file is by these simple steps:

1- Add your pdf file inside the public folder

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

Here is video to show you this by details https://www.youtube.com/watch?v=bNZ6FJrZ_lo&t=64s`

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIonut HulubView Question on Stackoverflow
Solution 1 - Ruby on-RailsfelipeclopesView Answer on Stackoverflow
Solution 2 - Ruby on-RailsrusllonrailsView Answer on Stackoverflow
Solution 3 - Ruby on-RailsCruz NunezView Answer on Stackoverflow
Solution 4 - Ruby on-RailsMuhammad Nasir ShamshadView Answer on Stackoverflow
Solution 5 - Ruby on-RailsHafiz Abdul RehmanView Answer on Stackoverflow
Solution 6 - Ruby on-RailsnourzaView Answer on Stackoverflow