Question

J'utilise Paperclip avec Ruby on Rails pour attacher des actifs à un modèle. Ces actifs peuvent être n'importe quel type de fichier. À l'heure actuelle, les vignettes ne sont générées que si l'actif est une image. J'aimerais pouvoir afficher une image par défaut différente pour les autres fichiers, soit en générant une vignette des fichiers à télécharger, soit en configurant quelque chose avec default_url, mais jusqu'à présent, je ne trouve aucune ressource pour vous aider. je ne me retrouve pas seul.

Mon modèle est le suivant:

  class Asset < ActiveRecord::Base  
    has_attached_file :media,  
    :storage => :s3,  
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",  
    :path => ":attachment/:id/:style.:extension",  
    :bucket => S3_BUCKET,  
    :styles => {:thumb => "75x75>", :large => "600x800>",  
    :whiny => false,  
    :default_url => "/images/:attachment/missing.jpg"  

Quelqu'un at-il des ressources pour générer des vignettes personnalisées en cas d'échec de la génération, ou si quelque chose s'apparente à: content_type dans l'URL par défaut? J'ai parcouru la source et je n'ai pas réussi à aller nulle part.

Merci!

Était-ce utile?

La solution

J'ai en fait implémenté cette même fonctionnalité. Paperclip génère des vignettes pour toutes mes images et mes PDF, et j’ai ajouté des icônes de vignettes personnalisées pour les fichiers MS Word, Excel, HTML, TXT, etc.

Ma solution est assez simple. Dans mon modèle Pièce jointe (dans votre cas, Actif ), j'ai défini la méthode suivante:

def thumbnail_uri(style = :original)
  if style == :original || has_thumbnail?
    attachment.s3.interface.get_link(attachment.s3_bucket.to_s, attachment.path(style), EXPIRES_AFTER)
  else
    generic_icon_path style
  end
end

Ceci renvoie soit une URL à une vignette stockée sur S3, soit un chemin d'accès local à une icône PNG générique basée sur le type de contenu des ressources (voir ci-dessous). La méthode has_thumbnail? détermine si une vignette a été générée pour cet actif. C’est quelque chose que j’ai ajouté dans mon propre fork de Paperclip, mais vous pouvez le remplacer dans votre propre logique (je ne suis pas sûr de la manière "standard" de le déterminer, peut-être en comparant le chemin avec votre chemin "manquant" défini, ou même il suffit de comparer le type de contenu à une liste par défaut ["image / jpeg", "image / png"] etc).

Quoi qu'il en soit, voici la méthode qui renvoie un chemin d'accès à une icône générique basée à la fois sur le style de vignette (dans votre cas: thumb et: large) et sur le type de contenu:

# Generates a path to the thumbnail image for the given content type 
# and image size.
#
# e.g. a :small thumbnail with a content type of text/html, the file name 
#      would have the filename icon.small.text.html.png
#
# If no such thumbnail can be found a generic one is returned
def generic_icon_path(style = image.default_style)
  url = "/images/attachments/icon.#{style.to_s}.#{attachment_content_type.sub('/', '.')}.png"
  if File.exists? "#{RAILS_ROOT}/public/#{url}"
    url
  else
    "/images/attachments/icon.#{style.to_s}.default.png"
  end
end

Ensuite, pour ajouter une nouvelle vignette, il suffit d'ajouter des fichiers PNG dans / images / attachments / avec la convention de nom de fichier correcte. Mon style de vignette s’appelle: petit et j’ai défini des styles pour Word, Excel et du texte brut, c’est pourquoi à l’heure actuelle:

icon.small.application.msword.png
icon.small.text.plain.png
icon.small.application.vnd.ms-excel.png
icon.small.application.vnd.openxmlformats-officedocument.spreadsheetml.sheet.png
icon.small.application.vnd.openxmlformats-officedocument.wordprocessingml.document.png

Si le type de contenu n'est pas pris en charge, une icône générique "catch all" s'affiche:

icon.small.default.png

Autres conseils

Certains types de fichiers peuvent hériter de votre actif, par exemple. Vidéo et spécifiez un autre:

has_attached_file: media, ...,: style = > {....}

Consultez ce didacticiel pour vignettes vidéo .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top