Rails'link_to'立即下载图像,而不是在浏览器中打开它

时间:2011-07-20 02:41:23

标签: ruby-on-rails image download link-to

我有一个link_to Rails助手,可以在点击时下载壁纸。但是图像正在浏览器中加载而不是立即下载。

<%= link_to "1920x1080", @download.wallpapers[1].wallpaper.url %>

但与此同时,我有一个link_to Rails帮助程序,可以下载.exe格式的屏幕保护程序,但此处它的工作方式是:立即下载文件。

<%= link_to "720p", @download.screensavers.first.screensaver.url %>

我应该添加或执行哪些操作,以便图像不会在浏览器中打开,而是立即下载?

谢谢!

5 个答案:

答案 0 :(得分:34)

使用HTML5 download attribute可以更轻松地完成此操作。

<%= link_to 'Download existing avatar', @user.avatar(:original), download: "User_#{@user.id}_avatar" %>

答案 1 :(得分:14)

您可以在控制器中处理它,而不是将图像的链接放在标记中。然后在您的控制器中,您可以执行类似

的操作
send_file @download.wallpapers[1].wallpaper.url, :type => 'image/jpeg', :disposition => 'attachment'

阅读this

答案 2 :(得分:12)

通常,最简单的方法是在发送图像时设置适当的标题:

Content-Disposition: attachment; filename=&lt;file name.ext&gt;

如果您从文件系统提供文件,send_file方法将允许您正确设置此标头:

http://api.rubyonrails.org/classes/ActionController/Streaming.html#method-i-send_file

如果文件存储在数据库中,则可以改为使用send_data:

http://api.rubyonrails.org/classes/ActionController/Streaming.html#method-i-send_data

答案 3 :(得分:8)

Rails 3/4:

路线中的

get "home/download_pdf"
控制器中的

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

在视图中:

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

答案 4 :(得分:3)

这是使用带回形针的HTML5下载属性

的简单解决方案
<%= link_to item.name, item.asset.url, download: item.asset.original_filename %>