Reputation: 2382
I have a link_to Rails helper that downloads a wallpaper when clicked. But the image is loading in the browser instead of being downloaded immediately.
<%= link_to "1920x1080", @download.wallpapers[1].wallpaper.url %>
But at the same time I have a link_to Rails helper that downloads a screensaver of .exe format but here it works as inteded: file being downloaded immediately.
<%= link_to "720p", @download.screensavers.first.screensaver.url %>
What should I add or do so that the images will not be opened in the browser but instead be downloaded immediately?
Thanks!
Upvotes: 19
Views: 20911
Reputation: 41914
There is an easier way to do this with the HTML5 download attribute.
<%= link_to 'Download existing avatar', @user.avatar(:original), download: "User_#{@user.id}_avatar" %>
Upvotes: 43
Reputation: 476
Here's a simple solution using the HTML5 download attribute with paperclip
<%= link_to item.name, item.asset.url, download: item.asset.original_filename %>
Upvotes: 4
Reputation: 5856
Rails 3 / 4:
in routes:
get "home/download_pdf"
in controller:
def download_pdf
send_file(
"#{Rails.root}/public/your_file.pdf",
filename: "your_custom_file_name.pdf",
type: "application/pdf"
)
end
in view:
<%= link_to 'Download PDF', home_download_pdf_url %>
Upvotes: 8
Reputation: 3510
Instead of putting the link of the image in your tag, you can handle it in your controller. And then in your controller you can do something like
send_file @download.wallpapers[1].wallpaper.url, :type => 'image/jpeg', :disposition => 'attachment'
Read this
Upvotes: 14
Reputation: 59223
Generally, the cleanest way to do this is to set the appropriate header when sending the image:
Content-Disposition: attachment; filename=<file name.ext>
The send_file method will allow you to set this header appropriately if you're serving the file from the filesystem:
http://api.rubyonrails.org/classes/ActionController/Streaming.html#method-i-send_file
If the file is stored in your database, you can use send_data instead:
http://api.rubyonrails.org/classes/ActionController/Streaming.html#method-i-send_data
Upvotes: 12