¿Cuál es una forma de Ruby on Rails para guardar imágenes?

9

Desarrollo en iOS , y estoy cambiando de un backend PHP a Ruby on Rails. El formato de intercambio es JSON .

Una búsqueda rápida en Google para "guardar imágenes en Rails" tiene casi todos los resultados hablando de guardar datos de imágenes como blobs en la base de datos. Podría estar equivocado, pero tengo la impresión de que guardar datos de imagen en una base de datos es una gran pérdida de tiempo y espacio (en lugar de guardar un enlace a la ubicación del archivo ('/img/subcat/4656.png') .

En PHP, es bastante estándar recibir los datos, generar un nombre de archivo, guardar ese archivo en el disco y actualizar la base de datos con la ubicación de la imagen en el disco. ¿Es lo mismo para Ruby on Rails, o hay alguna funcionalidad de imagen ActiveRecord incorporada que no conozco?

usuario
fuente
1
Me topé con PaperClip , que parece estar bastante cerca de lo que quiero. Todavía agradecería los consejos de personas experimentadas de Rails sobre cómo lidiar con el servicio y la recepción de miles de imágenes a la velocidad óptima.
usuario
1
Sabes que la imagen ocupará la misma cantidad de espacio en la base de datos o en el disco, ¿verdad? Por instinto, diría que Rails se almacena en la base de datos porque no depende tanto de apache como de PHP para manejar el almacenamiento en caché. Sin embargo, eso podría estar completamente equivocado.
Florian Margaine
2
Sí, no creo que los datos de la imagen sean manipulados por la ubicación de almacenamiento. Los rieles pueden ser diferentes, pero algunos miembros confiables de SO parecen inclinarse hacia rutas de archivos en la base de datos. Además, creo que es un conocimiento convencional que las bases de datos son difíciles de escalar, por lo que almacenar toneladas de datos de imágenes en la base de datos seguramente no lo hará más fácil.
usuario

Respuestas:

4

Lo que he hecho en el pasado es usar PaperClip con Amazon S3 y CloudFront CDN para una entrega más rápida. PaperClip admite el almacenamiento S3 de forma muy sencilla: consulte su documentación para ver las opciones de configuración de almacenamiento S3 .

  1. Configure una distribución de CloudFront para reenviar solicitudes de imágenes a su bucket de S3 y otras solicitudes de activos estáticos a su aplicación Ruby on Rails (alternativamente, también puede cargarlos en S3, pero eso está fuera del alcance de esta pregunta).
  2. CNAME un dominio que controlas (como assets.example.com) para que apunte a tu distribución de CloudFront.
  3. En la configuración de PaperClip, establezca s3_host_alias: assets.example.com. Esto hará que las URL generadas en los recursos de imagen guardados utilicen su host de distribución de CloudFront.
  4. En su configuración de Ruby on Rails, puede hacerlo config.action_controller.asset_host = http://assets.example.com. Las URL de activos de Ruby on Rails también usarán su distribución de CloudFront, para el almacenamiento en caché / entrega más rápida.

Eso es bastante incompleto, pero es de esperar que te señale en la dirección de algunos recursos útiles. Por supuesto, esa es solo una solución, pero es una que me ha funcionado en una situación en la que estaba lidiando con cientos de miles de archivos adjuntos de imágenes en la base de datos.

(Como un posible paso avanzado que puede no ser necesario o útil para su caso, también puede configurar múltiples CNAME para su distribución de CloudFront, como assets0.example.comy assets1.example.com. Ambos clips s3_host_aliasy action_controller.asset_hostluego puede tomar lambdas que le permitirán determinar de manera determinista (según activo) genera URL que usan diferentes hosts, para una mejor paralelización si está descargando un montón de ellos en la misma página, ya que los navegadores limitarán las conexiones simultáneas máximas al mismo host).

gregates
fuente
3

He probado varias gemas, pero ahora estoy usando FineUploader junto con PaperClip

FineUploader maneja una gran cantidad de la GUI para usted, por ejemplo, el progreso de carga, arrastrar y soltar y la carga de múltiples archivos, y así sucesivamente. Estoy usando PaperClip porque quiero almacenar las imágenes en mis servidores en lugar de en S3.

Lo que normalmente hacemos es buscar una solución configurable lista para usar estable en lugar de recrear cosas desde cero. Con PaperClip almaceno las imágenes y con StateMachine hago conversiones en las imágenes y las coloco en una categoría basada en el nombre del archivo. Tenía la misma pregunta que tenía, y esta fue mi mejor solución de trabajo, por eso la comparto.

JeroenKnoops
fuente
2
Esto es solo una recomendación para que un paquete externo haga el trabajo; el OP preguntaba qué hacen normalmente los desarrolladores de Ruby on Rails para almacenar imágenes, no como una recomendación. Si bien esto podría ser un ejemplo de cómo lo hace un paquete, esto realmente no responde la pregunta.
Martijn Pieters
Cierto. Lo que normalmente hacemos es buscar una solución configurable lista para usar estable en lugar de recrear cosas desde cero. Con PaperClip almaceno las imágenes y con StateMachine hago conversiones en las imágenes y las coloco en una categoría basada en el nombre del archivo. Tenía la misma pregunta que tenía el OP, y esta fue mi mejor solución de trabajo, es por eso que la comparto ..
JeroenKnoops