2010-08-09 15 views
5

Me gustaría poder subir un archivo zip a mi aplicación Rails que contiene una cantidad de imágenes. Entonces me gustaría que Rails descomprima ese archivo y adjunte las imágenes al modelo de mi foto a través del Paperclip, para que finalmente se almacenen en mi cuenta de Amazon S3 (configurada a través de Paperclip).Cargando y descomprimiendo archivos en S3 a través de Rails alojado en Heroku?

Me gustaría hacer todo esto en mi sitio de Rails alojado en Heroku, que lamentablemente no permite el almacenamiento local de ningún tipo (que yo sepa) para realizar temporalmente la descompresión antes del análisis de Paperclip.

¿Cómo podría hacer esto?

Respuesta

4

Recomiendo cargar directamente a S3, que pasa completamente por alto Heroku por lo que no está limitado al tiempo de espera de solicitud de 30 segundos que aplican (que deja caer sus cargas después de ese momento) o el límite de 1gb /tmp. Después de subir el archivo, puede hacer una POST a su aplicación Rails con el nombre y la ubicación del archivo y luego realizar la operación de descompresión. Si desea utilizar Paperclip para el postprocesamiento, he adjuntado un enlace a continuación. Si termina yendo por la ruta de subir directamente a S3, que descarga el trabajo de su servidor Rails, vea mis proyectos de muestra:

Proyecto de ejemplo utilizando Rails 3, Flash y MooTools basado en FancyUploader para cargar directamente en S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

proyecto

muestra usando Rails 3, flash/Silverlight/GoogleGears/BrowserPlus y Plupload basado en jQuery para subir directamente a S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

Aquí está el enlace para el procesamiento posterior Paperclip por ejemplo, como imágenes:

http://www.railstoolkit.com/posts/fancyupload-amazon-s3-uploader-with-paperclip

1

Heroku permite escribir en #{RAILS_ROOT}/tmp.

Pero debe tener en cuenta que el archivo estará allí solo mientras dure la solicitud. Probablemente más tiempo, pero eso no está garantizado. Podría intentar bloquear la solicitud mientras descomprime y envía a S3, pero debe cuidar el tiempo que lleva.

Me parece que necesita un cargador de flash que pueda descomprimirse y enviarse a S3, sin Heroku.

+0

Pero, ¿podría seguir haciendo mis asociaciones de Paperclip en mi aplicación Rails si utilicé una carga de flash que pasó por alto a Heroku? Poco confundido aquí. – neezer

+0

Aquí hay un poco sobre cómo manejar los archivos existentes después de migrar su base de datos para usar papercliop.Usted puede, literalmente, establecer su modelo de instalación en un archivo como se muestra allí. Podría ayudarlo en lo que está tratando de hacer: http://thewebfellas.com/blog/2008/11/2/goodbye-attachment_fu-hello-paperclip –

2

dmagkic es correcto sobre rails_root/tmp. Recomiendo algo así como los siguientes:

  • Subir archivos a través heroku a S3
  • Configuración de un trabajo de fondo para comprimir los archivos (almacenar los nombres de los archivos que debe tener en grupo)
  • ejecutar el BJ que descarga el archivos de S3, los comprime, envía el archivo zip a S3 y elimina los archivos descomprimidos.

De esta forma, su aplicación seguirá respondiendo durante el proceso de carga.

Si intenta cargar varios archivos, PODRÍA escribir en/tmp, pero solo asegúrese de que todos los archivos aparezcan en la misma solicitud de publicación.

+0

Tiene cosas invertidas: quiero * cargar un archivo zip * y tienen Rails * almacenan los archivos descomprimidos *. Sin embargo, todavía no tengo claro cuánto tiempo tengo que trabajar con los archivos en '# {RAILS_ROOT}/tmp': ¿persisten hasta que llega la siguiente solicitud o caducan antes de esa fecha? ¿Y la solicitud debe ser para la misma acción o cualquier solicitud a la aplicación? – neezer

+0

OK, solo cambia las cosas un poco. Suba el archivo ZIP a S3 con clip y haga un trabajo en segundo plano para descomprimir y procesar los archivos. Una solicitud es 1 acción HTTP, no tienes más tiempo en/tmp que eso. –

Cuestiones relacionadas