Miniature personalizzate per tipi di file con Paperclip
-
05-07-2019 - |
Domanda
Sto usando Paperclip con un Ruby on Rails per allegare risorse a un modello, queste risorse possono essere di qualsiasi tipo di file e attualmente le miniature vengono generate solo se la risorsa è un'immagine. Mi piacerebbe essere in grado di visualizzare un'immagine predefinita diversa per altri file, sia generando una miniatura dei file al momento del caricamento, sia impostando qualcosa con default_url, ma finora non riesco a trovare alcuna risorsa per aiutare con questo e non ottengo dove da solo.
Il mio modello è il 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 delle risorse per generare miniature personalizzate se la generazione fallisce o si ricorre a qualcosa del tipo: content_type nell'URL predefinito? Ho guardato attraverso la fonte e non sono stato in grado di arrivare da nessuna parte.
Grazie!
Soluzione
In realtà ho implementato questa stessa funzione. Paperclip genera miniature per tutte le mie immagini e PDF, e ho aggiunto icone di miniature personalizzate per file MS Word, Excel, HTML, TXT ecc.
La mia soluzione è abbastanza semplice. Nel mio modello Allegato
(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
Questo restituisce un URL a una miniatura memorizzata su S3 o un percorso locale a un'icona PNG generica basata sul tipo di contenuto delle risorse (discusso di seguito). Il metodo has_thumbnail?
determina se a questa risorsa è stata generata o meno una miniatura per essa. Questo è qualcosa che ho aggiunto nel mio fork di Paperclip, ma puoi sostituirlo nella tua logica (non sono sicuro del modo "standard" per determinarlo, magari confrontando il percorso con il tuo percorso "mancante" definito, o anche solo confrontando il tipo di contenuto con un elenco predefinito [" image / jpeg " ;, " image / png "] ecc.)
Comunque, ecco il metodo che restituisce un percorso a un'icona generica basata sia sullo stile delle miniature (nel tuo caso: pollice e: grande) che sul 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
Quindi, per aggiungere una nuova miniatura, aggiungo solo i file PNG in / images / attachments /
con la convenzione del nome file corretta. Il mio stile thumbail si chiama: piccolo e ho definito stili per Word, Excel e testo normale, quindi al 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, viene visualizzata un'icona generica "cattura tutto":
icon.small.default.png
Altri suggerimenti
Potresti avere alcuni tipi di file ereditati dal tuo asset, ad es. Video e specificare un diverso:
has_attached_file: media, ...,: style = > {....}
Dai un'occhiata a questo tutorial per miniature dei video .