2009-07-30 7 views
13

J'utilise Paperclip avec un Ruby on Rails pour attacher des éléments à un modèle. Ces actifs peuvent être de n'importe quel type et actuellement les miniatures 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 d'autres fichiers, soit en générant une vignette des fichiers téléchargés, soit en configurant quelque chose avec default_url mais pour l'instant je ne trouve aucune ressource pour vous aider et Je n'obtiens aucun endroit par moi-même.Miniatures personnalisées pour les types de fichiers avec Paperclip

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 si la génération échoue ou se rabattent sur quelque chose comme: content_type dans l'URL par défaut? J'ai regardé à travers la source et n'ai pas pu aller n'importe où.

Merci!

Répondre

17

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

Ma solution est assez simple. Dans mon modèle Attachment (dans votre cas Asset) 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 

Cela renvoie une URL à une vignette stockée sur S3, ou un chemin local vers une icône PNG générique sur la base des actifs de contenu type (discuté ci-dessous). La méthode has_thumbnail? détermine si une miniature a été générée pour cet élément. C'est quelque chose que j'ai ajouté dans ma propre fourche de Paperclip, mais vous pouvez le remplacer dans votre propre logique (je ne suis pas sûr de la façon «standard» de le déterminer, peut-être comparer le chemin avec votre chemin juste en comparant le type de contenu à une liste par défaut ["image/jpeg", "image/png"] etc).

Quoi qu'il en soit, voici la méthode qui passe en arrière un chemin vers une icône générique basée à la fois sur le style des vignettes (dans votre cas: le pouce et un grand) et 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, ajouter une nouvelle vignette Je viens d'ajouter des fichiers PNG dans /images/attachments/ avec la convention de nom de fichier correcte. Mon style en vignette est appelé: petit et j'ai défini des styles pour Word, Excel et texte brut donc à l'heure actuelle je:

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 ne sont pas pris en charge, il y a un générique « fourre-tout » icône qui est affichée:

icon.small.default.png 
+0

Impressionnant! Merci beaucoup. Je vais essayer cela dès le matin. On dirait exactement ce que j'essayais de faire. – Chelsea

+1

Merci encore, cela s'est bien passé dans environ 10 minutes. Vraiment apprécier l'aide. – Chelsea

+1

De rien! – Olly

0

Vous pourriez avoir des types de fichiers hérités de votre Asset, par ex. Vidéo et spécifiez un autre:

has_attached_file: médias, ...,: style => {....}

Jetez un oeil à ce tutoriel pour video thumbnails.

Questions connexes