Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby on Rails
Code

Téléchargement avec Rails et Paperclip

by
Length:MediumLanguages:

French (Français) translation by New Lune (you can also view the original English article)

C'est le dernier article de la série "Téléchargement avec Rails". Au cours des derniers mois, nous avons déjà discuté de Shrine, Dragonfly et de Carrierwave gems. L'invité d'aujourd'hui est Paperclip par Thoughtbot, une société qui gère des gemmes comme FactoryGirl et Bourbon.

Paperclip est probablement la solution de gestion des pièces jointes la plus populaire pour Rails (plus de 13 millions de téléchargements) et pour une bonne raison: elle possède de nombreuses fonctionnalités, une grande communauté et une documentation approfondie. Nous espérons néanmoins que cela vous aidera dans vos recherches.

Dans cet article, vous apprendrez à:

  • Préparer à l'installation de Paperclip
  • Intégrer Paperclip dans une application Rails
  • Ajouter des validations d'attachement
  • Générer des vignettes et traiter des images
  • Obscurcir des URLs
  • Enregistrer des pièces jointes sur Amazon S3
  • Garantir les fichiers dans le cloud en introduisant une logique d'autorisation

Le code source de cet article est disponible sur GitHub.

Les préparatifs

Avant de plonger dans le code, abordons d'abord certaines réserves dont vous avez besoin pour réussir à travailler avec Paperclip:

  • La dernière version de Paperclip supporte Rails 4.2+ et Ruby 2.1+. Cette gemme peut également être utilisée sans Rails.
  • ImageMagick doit être installé sur votre PC (il est disponible pour toutes les principales plates-formes), et Paperclip devrait pouvoir y accéder.
  • La commande file devrait être disponible à partir de la ligne de commande. Pour Windows, il est disponible via Development Kit, alors suivez ces instructions si vous n'avez pas déjà installé DevKit.

Lorsque vous êtes prêt, allez-y et créez une nouvelle application Rails (je vais utiliser Rails 5.0.2) sans la suite de test par défaut:

Paperclip d'intégration

Déposez le Paperclip gem:

Gemfile

Installez-le:

Supposons que nous créions une application de bibliothèque qui présente une liste de livres. Chaque livre aura un titre, une description, le nom d'un auteur et une image de couverture. Pour commencer, générez et appliquez la migration suivante:

Notez le type d'attachment qui nous est présenté par Paperclip. Sous le capot, il va nous créer quatre champs:

  • image_file_name
  • image_file_size
  • image_content_type
  • image_updated_at

Contrairement aux Shrine et Carrierwave gems, Paperclip n'a pas de fichier séparé avec des configurations. Tous les paramètres sont définis dans le modèle lui-même en utilisant la méthode has_attached_file, alors ajoutez-le maintenant:

models/book.rb

Avant de passer à la partie principale, créons également un contrôleur avec des vues et des itinéraires.

Création du contrôleur, des vues et des itinéraires

Notre contrôleur sera très simple:

books_controller.rb

Voici une vue d'index et une partie:

views/books/index.html.erb

views/books/_book.html.erb

Maintenant, les itinéraires:

config/routes.rb

Bien! Passons maintenant à la section principale et codez la nouvelle action et un formulaire.

Téléchargement de fichiers

Dans l'ensemble, faire des téléchargements avec Paperclip est facile. Vous devez seulement autoriser l'attribut correspondant (dans notre cas, c'est l'attribut d'image, et nous l'avons déjà autorisé) et présenter un champ de fichier dans votre formulaire. Faisons-le maintenant:

views/books/new.html.erb

views/books/_form.html.erb

Avec cette configuration, vous pouvez déjà commencer à effectuer des téléchargements, mais c'est une bonne idée d'introduire des validations aussi.

Ajout de validation

Les validations dans Paperclip peuvent être écrites en utilisant les anciennes personnes comme validates_attachment_presence et validates_attachment_content_type ou en utilisant la méthode validates_attachment pour définir plusieurs règles à la fois. Restons avec cette dernière option:

models/book.rb

Le code est vraiment simple, comme vous pouvez le constater. Nous exigeons que le fichier soit une image de moins de 1 mégaoctet. Notez que si la validation échoue, aucun post-traitement ne sera effectué. Paperclip contient déjà des messages d'erreur pour la langue anglaise, mais si vous souhaitez prendre en charge d'autres langues, incluez le paperclip-i18n gem dans votre Gemfile.

Une autre chose importante à mentionner est que le Paperclip vous oblige à valider le type de contenu ou le nom de fichier de toutes les pièces jointes, sinon cela soulèvera une erreur. Si vous êtes à 100% sûr de ne pas avoir besoin de telles validations (ce qui est un cas rare), utilisez do_not_validate_attachment_file_type pour indiquer explicitement quels champs ne doivent pas être vérifiés.

Ayant ajouté des validations, affichons également des messages d'erreur dans notre formulaire:

views/shared/_errors.html.erb

views/books/_form.html.erb

Affichage d'images

D'accord, alors, maintenant, les images téléchargées devraient être affichées de quelque façon. Cela se fait en utilisant l'assistant image_tag et une méthode url. Créer une vue d'affichage:

views/books/show.html.erb

Nous affichons une image uniquement si elle existe réellement sur le lecteur. En outre, si vous utilisez le stockage en cloud, Paperclip effectuera une demande de réseau et vérifiera l'existence du fichier. Bien sûr, cette opération peut prendre un certain temps, donc vous pouvez utiliser le present? ou un file? méthodes à la place: ils s'assurent simplement que le champ image_file_name est peuplé d'un certain contenu.

Obscurcissement URI

Par défaut, toutes les pièces jointes sont stockées dans le dossier public/system, donc vous voudrez probablement l'exclure du système de contrôle de version:

.gitignore

Cependant, l'affichage d'un URI complet dans le fichier peut ne pas toujours être une bonne idée, et vous devrez peut-être l'obscurcir de quelque façon. Le moyen le plus simple d'activer l'obstruction est en fournissant deux paramètres à has_attached_file method:

models/book.rb

Les valeurs appropriées seront interpolées dans l'url automatiquement. hash_secret est un champ obligatoire, et le moyen le plus simple de le générer est en utilisant:

Travailler avec des styles

Dans de nombreux cas, il est préférable d'afficher la vignette d'une image avec une largeur et une hauteur prédéfinies pour économiser de la bande passante. Paperclip résout ceci en utilisant des styles: chaque style a un nom et un ensemble de règles, comme les dimensions, le format, la qualité, etc.

Supposons que nous voulons que l'image originale et sa vignette soient converties au format JPEG. La miniature doit être recadrée à 300x300px:

models/book.rb

# est un paramètre de géométrie signifiant: "Recadrer si nécessaire tout en maintenant le rapport d'aspect".

Nous pouvons également fournir des options de conversion supplémentaires pour chaque style. Par exemple, fournissons 70% de qualité pour les pouces tout en supprimant toutes les métadonnées et 90% de qualité pour l'image d'origine pour en faire un peu plus petit:

models/book.rb

Bien! Affichez la vignette et fournissez le lien vers l'image originale:

views/books/show.html.erb

Notez que contrairement à Carrierwave, par exemple, Paperclip ne vous permet pas d'écrire @book.image.thumb.url.

Si, pour une raison quelconque, vous souhaitez mettre à jour manuellement les images téléchargées, vous pouvez utiliser les commandes suivantes pour actualiser uniquement les miniatures, ajouter des styles manquants ou actualiser toutes les images:

  • rake paperclip:refresh:thumbnails CLASS=Book
  • rake paperclip:refresh:missing_styles CLASS=Book
  • rake paperclip:refresh CLASS=Book

Enregistrement de fichiers dans cloud

Comme toutes les solutions similaires, Paperclip vous permet de télécharger des fichiers sur le cloud. Out of the box, il prend en charge les adaptateurs S3 et Fog, mais il existe des gemmes tierces pour Azure et Dropbox. Dans cette section, je vais vous montrer comment intégrer Paperclip avec Amazon S3. D'abord, lâchez le gem aws-sdk:

Installez-le:

Ensuite, fournissez un nouvel ensemble d'options à la méthode has_attached_file:

models/book.rb

Ici, je collage au dotenv-rails gem pour définir les variables d'environnement. Vous pouvez fournir toutes les valeurs directement à l'intérieur du modèle, mais ne le rendez pas public.

Ce qui est intéressant, c'est que s3_credentials accepte également un chemin d'accès vers un fichier YAML contenant vos clés et un nom de panier. En outre, vous pouvez définir différentes valeurs pour différents environnements comme ceci:

C'est tout! Tous les fichiers que vous téléchargez seront maintenant situés dans votre seau S3.

Sécurisation des fichiers dans cloud

Supposons que vous ne souhaitez pas que vos fichiers téléchargés soient disponibles pour tous. Par défaut, tous les téléchargements dans le nuage sont marqués comme publics, ce qui signifie que tout le monde peut ouvrir le fichier via le lien direct. Si vous souhaitez introduire une logique d'autorisation et vérifier qui est capable de visualiser le fichier, définissez l'option s3_permissions sur :private comme cela:

Maintenant, cependant, personne sauf que vous pourrez voir les fichiers. Par conséquent, créons une nouvelle action de download pour BooksController:

books_controller.rb

Cette action redirige simplement les utilisateurs vers l'image via un lien expirant. En utilisant cette approche, vous pouvez maintenant introduire toute logique d'autorisation à l'aide de gemmes comme CanCanCan ou Pundit.

N'oubliez pas de définir l'itinéraire du membre:

config/routes.rb

L'aide devrait être utilisé comme ceci:

Conclusion

Nous sommes arrivés à la fin de cet article! Aujourd'hui, nous avons vu Paperclip, une solution de gestion des pièces jointes pour Rails, en action et discuté de ses principaux concepts. Il y a beaucoup plus à cette gemme, alors assurez-vous de consulter sa documentation.

De plus, je recommande de visiter la page wiki de Paperclip car elle présente une liste de tutoriels "comment faire" et un tas de liens vers des gemmes tierces prenant en charge Azure et Cloudinary et vous permettant de minimiser facilement les fichiers téléchargés.

Merci de rester avec moi et à bientôt!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.