2011-01-27 14 views
6

Mi aplicación utiliza Rails 2 backend, Heroku para hosting, Paperclip para cargas de archivos y Amazon S3 para almacenamiento de archivos.Descargar archivo al hacer clic - Ruby on Rails

En este momento los usuarios pueden cargar archivos con paperclip + s3 - esto funciona sin problemas. Después de la carga, aparece un ícono en su tablero, vinculado a la ubicación del archivo (en el depósito s3). Cuando se hace clic en el icono, el navegador abre el archivo en una nueva ventana (para la mayoría de los tipos de archivos: PDF, MP3, img, etc.). En lugar de abrir, quiero que el archivo se descargue automáticamente cuando el usuario hace clic en el ícono del archivo (como archivos adjuntos de Gmail). La solución debería poder funcionar para cualquier tipo de archivo y navegador cruzado.

¿Hay un ayudante para hacer esto en los rieles, o es necesario javascript? Estoy realmente atrapado en esto, así que cualquier cosa que me señale en la dirección correcta sería muy apreciada. ¡Gracias!

Respuesta

10

intenta lo siguiente:

class Test < ActiveRecord::Base 

    has_attached_file :testfile, 
    :storage => :s3, 
    # All your S3 config 
    :s3_headers => {"Content-Disposition" => "attachment"} 

end 

Esto debe decirle al Paperclip de la gema para establecer el "Content-Disposition" cabecera de el valor "adjunto" para los archivos cargados recientemente.

Tenga en cuenta que debe editar manualmente el archivo ya cargado, p. con Cyberduck u otro cliente FTP.

+1

¡Gracias por la sugerencia! Solo para tu información, creo que tienes un tipo aquí. '{" Content-Disposition ":" attachment "}' lanzó un error pero '{" Content-Disposition "=>" attachment "}' funcionó correctamente. – aguynamedloren

+0

'{" Content-Disposition ":" attachment "}' solo es Ruby 1.9. Use '{" Content-Disposition "=>" attachment "}' si todavía está en 1.8. – x1a4

2

Cuando transfiere el archivo, necesita establecer un encabezado Content-Disposition con un valor de attachment; filename=yourfilename.pdf. Si se transfiere directamente desde S3, deberá decirle a S3 que configure los encabezados Content-Disposition también. Posiblemente también Content-Type.

Tenga en cuenta que si usted le dice S3 para asociar una cabecera Content-Disposition, lo hará siempre de transmisión esta cabecera.

Fwiw, aquí está la documentación de Amazon en hacer un PUT para un objeto: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPUT.html