Iloo

https://iloo.wordpress.com

Ruby on Rails: descargar archivos desde Amazon S3

Con el trabajo, clases y entrenamientos (si también practico deportes), no puedo escribir tanto como quisiera, pero vamos haciendo la lucha.

Caso de estudio:

  • Aplicación alojada en Heroku, por tanto no se pueden subir archivos al servidor, se tienen que subir a Amazon S3.
  • Para subir los archivos se uso CarrierWave.
  • Se desea descargar los archivos alojados en Amazon S3 desde la aplicación en cuestión.

Vamos primero, instalando la gema necesaria, en el archivo Gemfile:

gem 'aws-s3'

Luego el bundle:

bundle install

En app/config/initializers se crea un archivo, en este caso aws_credentials.rb, con el siguiente contenido:

AWS::S3::Base.establish_connection!(
 :access_key_id => 'your_key_id',
 :secret_access_key => 'your_secret_key'
)

Suponiendo que se tiene un controlador files_controller.rb, y un modelo file.rb, se agregala función en cuestion para descargar el archivo

def download
 file = Files.find(params[:id])
 filename = file.filename.to_s.split('?').first.split('/').last
 aws_path = 'uploads/' + filename
 aws_object = AWS::S3::S3Object.find aws_path, 'bucket'
 send_data(aws_object.value, :filename => filename,:disposition => 'attachment') 
end

Debido a CarrierWave, file.filename, devuelve toda la url del archivo alojado en Amazon S3, es por que se esta usando el split, para obtener solo el nombre del archivo y almacenarlo en la variable filename.

Dependiendo como se haya configurado el uploader de CarrierWave se debe modificar lo que se esta almacenando en la variable aws_path, es la ruta donde se encuentra el archivo en Amazon S3.

En aws_object se tiene la ruta completa del archivo y se especifica el bucket donde se encuentra el archivo.

Finalmente se envía el archivo con send_data.

Por último se debe agregar la acción al archivo routes:

get :download, :on => :collection

7 Respuestas a “Ruby on Rails: descargar archivos desde Amazon S3

  1. juanalexander11 15/08/2013 en 12:18 PM

    hago lo que dice la documentacion y me da el error a la hora de la descar
    AWS::S3::AccessDenied
    Access Denied

    me podrias decir a que se debe ese error

    • hellboy 19/08/2013 en 9:39 AM

      Deberías revisar si tus credenciales son correctas, podrías probar subiendo archivos a amazon. En caso de no ser eso, es posible que la carpeta (bucket) o los archivos no tengan los permisos de lectura. Saludos

  2. juanalexander11 19/08/2013 en 10:26 AM

    grax por responder, a amazon me sube los archivos y todo en sus respectivas carpetas, y para darle permisos al bucket desd dond lo haces en parque de amazon se le dan los permisos

    • hellboy 19/08/2013 en 10:46 AM

      Eliges el bucket o el documento, y en la parte superior derecha marcas “Properties” y en el apartado “Permissions” podras ver los permisos. Tambien puedes verificar que el filename sea la ruta completa del documento.

  3. juanalexander11 19/08/2013 en 11:50 AM

    grax por tu ayuda me sirvio de mucho!!

  4. juanalexander11 21/08/2013 en 12:53 PM

    otra pregunta fijate que ahroa me da un nuevo error cuando defino todos los parametros y a la hora de descargar me sale que no tengo definido undefined local variable or method `name’ for # ya intente solucionarlo y no tube exitos espero tu respuesta

    • hellboy 22/08/2013 en 11:00 AM

      Como el error te lo dice, te definir el campo name, revisa tus modelos y compara con tus tablas, Tal vez te falta una migración o el campo no esta definido en attr_accessible.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s