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!

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top