2009-07-30 15 views
13

Sto utilizzando Paperclip con un Ruby on Rails per collegare le risorse a un modello, queste risorse possono essere di qualsiasi tipo di file e le miniature correnti vengono generate solo se l'asset è un'immagine. Mi piacerebbe essere in grado di visualizzare un'immagine di default diversa per altri file, sia generando una miniatura dei file in fase di caricamento, sia impostando qualcosa con default_url ma finora non riesco a trovare alcuna risorsa per aiutare con questo e Sto arrivando da nessuna parte da solo.Miniature personalizzate per i tipi di file con Paperclip

Il mio modello è la seguente:

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" 

Qualcuno ha tutte le risorse per la generazione di miniature personalizzate se la generazione non riesce, o ripiegare su qualcosa di simile: content_type nel URL di default? Ho guardato attraverso la fonte e non sono stato in grado di arrivare da nessuna parte.

Grazie!

risposta

17

In realtà ho implementato questa stessa funzione. Paperclip genera miniature per tutte le mie immagini e PDF e ho aggiunto icone miniatura personalizzate per file MS Word, Excel, HTML, TXT ecc.

La mia soluzione è abbastanza semplice. Nel mio modello Attachment (nel tuo caso Asset) ho definito il seguente metodo:

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 

Ciò restituisce un URL di una miniatura memorizzati su S3, o un percorso locale per un'icona PNG generica sulla base degli attivi contenuti tipo (discusso di seguito). Il metodo has_thumbnail? determina se questa risorsa ha o meno una miniatura generata per esso. Questo è qualcosa che ho aggiunto nel mio fork di Paperclip, ma puoi sostituirlo con la tua logica (non sono sicuro del modo "standard" per determinarlo, magari confrontando il percorso con il tuo percorso "mancante" definito, o anche basta confrontare il tipo di contenuto con un elenco predefinito ["immagine/jpeg", "immagine/png"] ecc.).

Ad ogni modo, ecco il metodo che passa di nuovo il percorso di un'icona generica in base sia lo stile delle miniature (nel tuo caso: pollice e: grande) e il tipo di contenuto:

# 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 

Poi, per aggiungere una nuova miniatura Aggiungo semplicemente i file PNG in /images/attachments/ con la convenzione del nome file corretta. Il mio stile thumbail si chiama: piccolo e mi hanno definito stili per Word, Excel e testo normale così in questo momento ho:

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 

Se il tipo di contenuto non è supportato, c'è un generico 'fermo tutto' icona che viene visualizzata:

icon.small.default.png 
+0

Impressionante! Molte grazie. Lo proverò per prima cosa domani mattina. Sembra esattamente quello che stavo cercando di fare. – Chelsea

+1

Grazie ancora, ha funzionato bene in circa 10 minuti. Apprezzo davvero l'aiuto. – Chelsea

+1

Prego! – Olly

0

È possibile ereditare alcuni tipi di file dal proprio asset, ad es. Video e specificare una diversa:

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

Dai un'occhiata a questo tutorial per video thumbnails.

Problemi correlati