Benutzerdefinierte Thumbnails für Dateitypen mit Paperclip - Ruby-on-Rails, Bild, Datei-Upload, Büroklammer, Thumbnails

Ich benutze Paperclip mit einem Ruby on Rails zuWenn Sie Assets an ein Modell anhängen, können diese Assets einen beliebigen Dateityp aufweisen. Momentan werden nur Thumbnails generiert, wenn es sich bei dem Asset um ein Image handelt. Ich würde gerne in der Lage sein, ein anderes Standardbild für andere Dateien anzuzeigen, entweder indem ich ein Thumbnail der Dateien beim Hochladen erzeuge oder etwas mit der default_url aufstelle, aber bis jetzt kann ich keine Ressourcen finden, die mir dabei helfen und Ich komme nirgendwohin.

Mein Modell ist wie folgt:

  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"

Hat jemand irgendwelche Ressourcen zum Generieren?Benutzerdefinierte Thumbnails, wenn die Generierung fehlschlägt, oder auf etwas wie content_type in der Standard-URL zurückgreifen? Ich habe durch die Quelle geschaut und konnte nirgendwohin kommen.

Vielen Dank!

Antworten:

17 für die Antwort № 1

Ich habe tatsächlich dieses Feature implementiert. Paperclip erzeugt Thumbnails für alle meine Bilder und PDFs, und ich habe benutzerdefinierte Thumbnails für MS Word, Excel, HTML, TXT-Dateien usw. hinzugefügt.

Meine Lösung ist ziemlich einfach. In meinem Modell Attachment (in Ihrem Fall Asset) Ich habe die folgende Methode definiert:

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

Dies gibt entweder eine URL zu einem in S3 gespeicherten Thumbnail zurück oder einen lokalen Pfad zu einem generischen PNG-Icon, basierend auf dem Inhaltstyp des Assets (siehe unten). Das has_thumbnail? Methode bestimmt, ob dieses Asset hat oder nichtIch habe dafür ein Thumbnail erstellt. Dies ist etwas, das ich in meinem eigenen Fork von Paperclip hinzugefügt habe, aber Sie können in Ihrer eigenen Logik ersetzen (ich bin mir nicht sicher über den "Standard" Weg, dies zu bestimmen, vielleicht den Pfad mit Ihrem definierten "fehlenden" Pfad zu vergleichen) Vergleichen Sie einfach den Inhaltstyp mit einer Standardliste ["image / jpeg", "image / png"] usw.).

Wie auch immer, hier ist die Methode, die einen Pfad zu einem generischen Symbol zurückgibt, basierend auf dem Thumbnail-Stil (in Ihrem Fall: thumb und: large) und dem Inhaltstyp:

# 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

Um ein neues Thumbnail hinzuzufügen, füge ich einfach PNG-Dateien hinzu /images/attachments/ mit der korrekten Dateinamenskonvention. Mein Daumennagel-Stil heißt: klein und ich habe Stile für Word, Excel und Klartext definiert, daher habe ich zur Zeit:

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

Wenn der Inhaltstyp nicht unterstützt wird, gibt es ein generisches "catch all" -Symbol, das angezeigt wird:

icon.small.default.png

0 für die Antwort № 2

Sie könnten einige Dateitypen von Ihrem Asset erben lassen, z. Video und spezifizieren Sie ein anderes:

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

Sehen Sie sich dieses Tutorial an Video-Vorschaubilder.


Am beliebtesten