2009-07-30 19 views
13

Używam spinacza z rubinem na szynach, aby dołączyć zasoby do modelu. Te zasoby mogą być dowolnym typem pliku, a obecnie miniatury są generowane tylko wtedy, gdy zasób jest obrazem. Chciałbym móc wyświetlać inny domyślny obraz dla innych plików, albo generując miniaturkę plików podczas przesyłania, albo ustawiając coś na domyślnym_lecie, ale jak dotąd nie mogę znaleźć żadnych zasobów, które by to pomogły i nie dostaję się samemu.Niestandardowe miniatury dla typów plików z Paperclip

Mój model jest następujący:

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" 

Czy ktoś ma żadnych środków na generowanie niestandardowych miniatur jeśli pokolenie nie powiedzie, lub spaść z powrotem na coś takiego: content_type w domyślnym URL? Przejrzałem źródło i nigdzie się nie udało.

Dzięki!

Odpowiedz

17

W rzeczywistości zaimplementowałem tę samą funkcję. Paperclip generuje miniatury wszystkich moich obrazów i plików PDF, a także dodałem niestandardowe ikony miniatur dla plików MS Word, Excel, HTML, TXT itp.

Moje rozwiązanie jest dość proste. W moim modelu Attachment (w przypadku Asset) Mam zdefiniowane w następujący sposób:

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 

ta zwraca albo adres URL do miniatury przechowywanych na S3 lub lokalnej drodze do ogólnej ikony PNG w oparciu o aktywa treści typ (omówiony poniżej). Metoda has_thumbnail? określa, czy do tego zasobu został wygenerowany miniatura. To jest coś, co dodałem w moim własnym rozwidleniu Paperclip, ale możesz go zastąpić w swojej własnej logice (nie jestem pewien "standardowej" metody, aby to ustalić, być może porównując ścieżkę ze zdefiniowaną "brakującą" ścieżką, lub nawet po prostu porównując typ zawartości z domyślną listą ["image/jpeg", "image/png"] itd.).

Zresztą, tutaj jest metoda, która przechodzi z powrotem na ścieżkę do ikony generycznego na bazie zarówno stylu miniatur (w przypadku: kciuk i: duża) i typ zawartości:

# 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 

Następnie, aby dodać nowa miniatura Właśnie dodaję pliki PNG do /images/attachments/ z prawidłową konwencją nazw plików. Mój styl thumbail nazywa: mała i mam zdefiniowane style dla programów Word, Excel i zwykłego tekstu tak w chwili obecnej mam:

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 

Jeśli typ treści nie jest obsługiwany, jest nazwą rodzajową „złapać wszystkich” ikona, która jest wyświetlana:

icon.small.default.png 
+0

Awesome! Wielkie dzięki. Spróbuję tego rano. Wygląda na to, że dokładnie to, co próbowałem zrobić. – Chelsea

+1

Jeszcze raz dziękuję, udało mi się to dobrze i trwało około 10 minut. Naprawdę doceniam pomoc. – Chelsea

+1

Nie ma za co! – Olly

0

Możesz mieć niektóre typy plików dziedziczone z Twojego zasobu, np. Wideo i określ inny:

has_attached_file: mediów, ..., style => {....}

Wystarczy popatrzeć na tym kursie dla video thumbnails.

Powiązane problemy