Пользовательские эскизы для типов файлов с помощью Скрепки
-
05-07-2019 - |
Вопрос
Я использую скрепку с 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-адресе по умолчанию?Я просмотрел исходный код и ничего не смог найти.
Спасибо!
Решение
На самом деле я реализовал эту самую функцию.Paperclip создает миниатюры для всех моих изображений и 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?
метод определяет, был ли для этого ресурса создан эскиз.Это то, что я добавил в свой собственный fork of 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
Другие советы
У вас могут быть некоторые типы файлов, унаследованные от вашего ресурса, напримерВидео и укажите другой:
has_attached_file :медиа, ..., :стиль => {....}
Взгляните на этот учебник для миниатюры видео.