2011-07-20 16 views
12

tengo un ayudante link_to rieles que descarga un fondo de pantalla cuando se hace clic. Pero la imagen se carga en el navegador en lugar de descargarse de inmediato.Rails link_to 'para descargar una imagen inmediatamente en lugar de abrirlo en el navegador

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

Pero, al mismo tiempo que tengo un ayudante link_to rieles que descarga un protector de pantalla de formato .exe pero aquí funciona como inteded: archivo que se descarga inmediatamente.

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

¿Qué debo agregar o hacer para que las imágenes no se abran en el navegador sino que se descarguen de inmediato?

Gracias!

+1

bastante seguro de que esto es una cuestión específica del navegador, no una cuestión de Web-marco. No puede ver un EXE en un navegador, pero puede ver una imagen. –

Respuesta

11

En general, la manera más limpia de hacer esto es para establecer la cabecera apropiada al enviar la imagen:

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

El método send_file le permitirá configurar esta cabecera apropiadamente si usted está sirviendo el archivo de la sistema de archivos:

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

Si el archivo se almacena en su base de datos, se puede utilizar en lugar send_data:

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

+0

:(14 segundos tarde – vinceh

+0

Gracias por la respuesta! – neilmarion

13

En lugar de poner el enlace de la imagen en la etiqueta, se puede manejar en su controlador. Y luego, en su controlador puede hacer algo como

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

Leer this

+0

Gracias por la respuesta! – neilmarion

+0

No se olvide de marcar la respuesta correcta :) – vinceh

+0

un mejor enlace: http://apidock.com/rails/ActionController/DataStreaming/send_file – montrealmike

8

Rails 3/4:

en rutas:

get "home/download_pdf" 

en el controlador:

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

en vista:

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

¿Qué ocurre si el enlace se genera en .cada iteración y el nombre de archivo es dinámico? –

25

Existe una manera más fácil de hacer esto con el HTML5 download attribute.

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

Esto definitivamente debería ser la respuesta aceptada ahora. – taylorthurlow

0

Aquí es una solución sencilla utilizando el atributo de descarga HTML5 con un clip

<%= link_to item.name, item.asset.url, download: item.asset.original_filename %> 
Cuestiones relacionadas