Qu'est-ce qu'une méthode Ruby on Rails pour enregistrer des images?

9

Je développe sur iOS et je passe d'un backend PHP à Ruby on Rails. Le format d'échange est JSON .

Une recherche rapide sur Google pour «enregistrer les images dans Rails» a presque tous les résultats parlant de l'enregistrement des données d'image sous forme de blobs dans la base de données. Je peux me tromper, mais j'ai l'impression que l'enregistrement des données d'image dans une base de données est une énorme perte de temps et d'espace (par opposition à l'enregistrement d'un lien vers l'emplacement du fichier ('/img/subcat/4656.png') .

En PHP, il est assez standard de recevoir les données, de générer un nom de fichier, d'enregistrer ce fichier sur le disque et de mettre à jour la base de données avec l'emplacement de l'image sur le disque. Est-ce la même chose pour Ruby on Rails, ou existe-t-il une fonctionnalité d'image ActiveRecord intégrée que je ne connais pas?

utilisateur
la source
1
Je suis tombé sur PaperClip , qui semble être assez proche de ce que je veux. J'apprécierais toujours les conseils de gens expérimentés de Rails sur la façon de gérer et de recevoir des milliers d'images à une vitesse optimale.
utilisateur
1
Vous savez que l'image prendra autant d'espace sur la base de données ou sur le disque, non? De l'intuition, je dirais que Rails stocke dans la base de données car il ne dépend pas autant d'Apache que de PHP pour gérer la mise en cache. Mais cela pourrait être complètement faux.
Florian Margaine
2
Oui, je ne pense pas que les données d'image seront manipulées par l'emplacement de stockage. Les rails peuvent être différents, mais certains membres SO fiables semblent se pencher vers les chemins de fichiers dans la base de données. De plus, je pense qu'il est de notoriété publique que les bases de données sont difficiles à mettre à l'échelle, donc le stockage de tonnes de données d'image dans la base de données ne facilitera certainement pas cela.
utilisateur

Réponses:

4

J'ai déjà utilisé PaperClip avec Amazon S3 et CloudFront CDN pour une livraison plus rapide. PaperClip prend très bien en charge le stockage S3: consultez leur documentation pour les options de configuration du stockage S3 .

  1. Configurez une distribution CloudFront pour transférer les demandes d'images vers votre compartiment S3 et d'autres demandes d'actifs statiques vers votre application Ruby on Rails (vous pouvez également les télécharger vers S3 également, mais cela n'entre pas dans le cadre de cette question).
  2. CNAME un domaine que vous contrôlez (tel que assets.example.com) pour pointer vers votre distribution CloudFront.
  3. Dans la configuration PaperClip, définissez s3_host_alias: assets.example.com. Cela entraînera les URL générées vers les ressources d'image enregistrées à utiliser votre hôte de distribution CloudFront.
  4. Dans votre configuration Ruby on Rails, vous pouvez alors le faire config.action_controller.asset_host = http://assets.example.com. Les URL des ressources Ruby on Rails utiliseront ensuite également votre distribution CloudFront, pour la mise en cache / une livraison plus rapide.

C'est assez sommaire, mais j'espère que cela vous oriente vers des ressources utiles. Bien sûr, ce n'est qu'une solution, mais c'est celle qui a fonctionné pour moi dans une situation où je faisais face à des centaines de milliers de pièces jointes d'images dans la base de données.

(En tant qu'étape avancée possible qui peut ne pas être nécessaire ou utile pour votre cas, vous pouvez également configurer plusieurs CNAME pour votre distribution CloudFront, tels que assets0.example.comet assets1.example.com. Les deux trombones s3_host_aliaset action_controller.asset_hostpeuvent alors prendre des lambdas qui vous permettront de déterminer de manière déterministe atout) générer des URL qui utilisent différents hôtes, pour une meilleure parallélisation si vous en téléchargez plusieurs sur la même page, car les navigateurs limiteront le nombre maximal de connexions simultanées au même hôte.)

grégates
la source
3

J'ai essayé plusieurs gemmes, mais maintenant j'utilise FineUploader avec PaperClip

FineUploader gère une grande partie de l'interface graphique pour vous, par exemple la progression du téléchargement, le glisser-déposer et plusieurs téléchargements de fichiers, etc. J'utilise PaperClip parce que je veux stocker les images sur mes serveurs plutôt que sur S3.

En règle générale, nous recherchons une solution configurable prête à l'emploi stable au lieu de recréer des éléments à partir de zéro. Avec PaperClip je stocke les images et avec un StateMachine je fais des conversions sur les images et les mets dans une catégorie basée sur le nom de fichier. J'avais la même question que vous, et c'était ma meilleure solution de travail, c'est pourquoi je la partage.

JeroenKnoops
la source
2
Ceci est juste une recommandation pour un package externe pour faire le travail; le PO demandait ce que les développeurs Ruby on Rails font normalement pour stocker des images, pas une recommandation. Bien que cela puisse être un exemple de la façon dont un package le fait, cela ne répond pas vraiment à la question.
Martijn Pieters
Vrai. En règle générale, nous recherchons une solution configurable prête à l'emploi stable au lieu de recréer des éléments à partir de zéro. Avec PaperClip je stocke les images et avec un StateMachine je fais des conversions sur les images et les mets dans une catégorie basée sur le nom de fichier. J'avais la même question que l'OP, et c'était ma meilleure solution de travail, c'est pourquoi je la partage ..
JeroenKnoops