Пользовательские эскизы для типов файлов с помощью Paperclip - PullRequest
13 голосов
/ 31 июля 2009

Я использую Paperclip с Ruby on Rails для присоединения ресурсов к модели, эти активы могут быть файлов любого типа, и в настоящее время миниатюры создаются, только если актив является изображением.Я хотел бы иметь возможность отображать другое изображение по умолчанию для других файлов, либо создав миниатюру файлов при загрузке, либо настроив что-то с помощью default_url, но до сих пор я не могу найти никаких ресурсов, чтобы помочь с этим иЯ никуда не попадаю.

Моя модель выглядит следующим образом:

  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"  

Есть ли у кого-нибудь ресурсы для генерации пользовательских миниатюр в случае сбоя генерации или использования чего-то вроде: content_typeв URL по умолчанию?Я просмотрел источник и не смог никуда добраться.

Спасибо!

Ответы [ 2 ]

17 голосов
/ 31 июля 2009

Я на самом деле реализовал эту же функцию. Скрепка создает миниатюры для всех моих изображений и PDF-файлов, и я добавил пользовательские иконки для файлов MS Word, Excel, HTML, TXT и т. Д.

Мое решение довольно простое. В моей модели Attachment (в вашем случае Asset) я определил следующий метод:

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

Возвращает либо URL-адрес миниатюры, хранящейся на S3, либо локальный путь к общему значку PNG на основе типа содержимого ресурсов (обсуждается ниже). Метод has_thumbnail? определяет, был ли для этого актива создан эскиз. Это то, что я добавил в свой собственный форк Paperclip, но вы можете заменить его своей собственной логикой (я не уверен в «стандартном» способе определения этого, например, сравнивая путь с вашим определенным «отсутствующим» путем, или даже просто сравнивая тип контента со списком по умолчанию ["image / jpeg", "image / png"] и т. д.).

В любом случае, вот метод, который возвращает путь к общей иконке на основе стиля миниатюр (в вашем случае: thumb и: large) и типа контента:

# 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

Затем, чтобы добавить новый эскиз, я просто добавляю PNG-файлы в /images/attachments/ с правильным соглашением об именах файлов. Мой стиль thumbail называется: small, и я определил стили для Word, Excel и обычного текста, поэтому в настоящее время у меня есть:

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

Если тип контента не поддерживается, есть общий значок «поймать все», который отображается:

icon.small.default.png
0 голосов
/ 31 июля 2009

Вы можете наследовать некоторые типы файлов из вашего Актива, например, Видео и укажите другое:

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

Посмотрите этот урок для миниатюр видео .

...