web-dev-qa-db-fra.com

Téléchargement de photos Ruby on Rails

Je suis nouveau chez Rails, donc désolé si cela est facile. Je me demande quel est le meilleur moyen de télécharger des photos et de les afficher dans Ruby on Rails. J'ai un blog et j'aimerais avoir la possibilité de joindre une photo lors de la création d'un article. 

38
bgadoci

Le trombone est assez génial. Il existe un excellent RailsCast à ce sujet - http://railscasts.com/episodes/134-Paperclip

25
danpickett

CarrierWave est un bijou plus récent que Paperclip, et il a l'air beaucoup plus flexible ..__ Il existe également un Railscast à ce sujet: http://railscasts.com/episodes/253-carrierwave-file-uploads

17
Felipe Cerda

En supposant que vous n’ayez pas besoin de fonctionnalités sophistiquées, que vous ne souhaitiez pas ajouter de dépendance et que vous souhaitiez stocker l’image sous forme de BLOB dans votre base de données, vous pouvez procéder comme suit:

Modèle:

class Image < ActiveRecord::Base
  def img=(input_data)
    self.filename = input_data.original_filename
    self.filetype = input_data.content_type.chomp
    self.img = input_data.read
  end
end

Manette:

class ImagesController < ApplicationController
  def display_img
    @img = Image.find(params[:id])
    send_data(@img.img, :type => @img.filetype, :filename => @img.filename,
              :disposition => 'inline')
  end
end

Voici un lien vers un tutoriel plus complet.

7
JRL

Beaucoup recommandent d'utiliser Carrierwave et je ne suis pas une exception, mais je voulais signaler une chose. Sur de nombreux sites écrits avec RoR (il est évident que ce n’est pas seulement une question de RoR), je remarque que la demande qui envoie l’image peut être en attente pendant environ 2-3 secondes et souvent même davantage, ce qui bloque l’instance de l’application (ce qui n’est probablement pas si terrible si vous utilisez des threads ou ne vous souciez pas beaucoup de la performance, c’est certainement le cas si vous utilisez Unicorn). Je vais donc expliquer comment éviter cela avec carrierwave:

1) Choisissez un travailleur de fond pour votre application (je vais généralement avec Sidekiq)

2) Ajoutez carrierwave_backgrounder à votre Gemfile et configurez-le pour fonctionner avec votre arrière-plan et carrierwave (tout dans son readme)

J'ai généralement le contrôle de mes répertoires alors je vais avec l'option store_in_background de carrierwave_backgrounder qui traite et stocke l'image dans le système de fichiers ou S3 ou tout ce que vous utilisez

3) Maintenant, lorsque vous mettez à jour la photo, son traitement et son stockage passent en arrière-plan, ce qui libère votre instance d'application mais cela prend un certain temps, généralement plus d'une seconde, et vous devez renvoyer une réponse à l'utilisateur.

4) Le moyen le plus simple de donner une réponse à l’utilisateur est de retourner le javascript dans lequel vous changez l’ancienne image en un gif avec spinner ou quelque chose comme ça et en définissant la fonction javascript SetInterval qui vérifie si la photo a été traitée (carrierwave_background fournit une fonction cela peut changer la colonne booléenne de votre modèle en true lorsque son traitement est terminé) en envoyant une demande AJAX toutes les 2 secondes ou ce que vous préférez et en modifiant l'image une fois traitée.

Vous disposez maintenant d’une instance d’application non liée et d’une bonne expérience utilisateur.

Post-scriptum Je suis nouveau dans Rails et dans le développement Web en tant que tel, ce guide peut contenir des mises en garde qui m'ont échappé.

J'espère que ça va aider quelqu'un.

Oh, et à propos, il y a ce nouveau joyau appelé refile, c'est incroyable et peut être une très bonne option dans certains cas.

4
NoDisplayName

CarrierWave est probablement la meilleure solution pour le téléchargement d’images dans Rails . Le post suivant décrit une solution pour le téléchargement d’images à l’aide de CarrierWave lorsque les transformations d’images sont effectuées de manière transparente dans le cloud. Les images téléchargées sont stockées dans le nuage et transmises via un CDN. Pas besoin d’installer RMagick, MiniMagick et ImageMagick . http://cloudinary.com/blog/Ruby_on_Rails_image_uploads_with_carrierwave_and_cloudinary

3
Cloudinary

Beaucoup de gens recommandent Trombone . Peut-être que vous voulez essayer d'utiliser cela en premier.

3
Joshua Partogi

attachment_fu (http://github.com/technoweenie/attachment_fu) est une autre option bien que je recommande personnellement Trombone . Il ne nécessite pas Rmagick, ce qui est un avantage considérable, et il prend en charge certaines fonctionnalités intéressantes, telles que le téléchargement sur S3 avec une configuration mineure.

2
samg

Sept 2018

Pour ceux qui vérifient cette question récemment, Rails 5.2+ a maintenant ActiveStorage par défaut et je recommande vivement de la vérifier.

Comme il fait maintenant partie intégrante du noyau de Rails 5.2+, il est très bien intégré et présente d’excellentes capacités hors de la boîte (tous les autres joyaux connus tels que Carrierwave, Shrine, Paperclip, ... sont excellents, mais celui-ci est très utile. bonnes fonctionnalités que nous pouvons considérer pour tout nouveau projet Rails)

L'équipe de trombones a déconseillé la gemme au profit de Rails ActiveStorage.

Voici la page github pour ActiveStorage & de nombreuses ressources sont disponibles partout

0
Ahmed Elkoussy