miniaturas personalizadas para tipos de arquivo com Paperclip
-
05-07-2019 - |
Pergunta
Eu estou usando Paperclip com um Ruby on Rails para anexar activos a um modelo, esses ativos pode ser qualquer tipo de arquivo e, atualmente, somente as miniaturas estão sendo gerados se o ativo é uma imagem. Eu gostaria de ser capaz de exibir uma imagem padrão diferente para outros arquivos, seja através da geração de uma miniatura dos arquivos em upload, ou definir alguma coisa com o default_url mas até agora eu não consigo encontrar quaisquer recursos para ajudar com isso e estou sem chegar onde em meu próprio.
Meu modelo é o seguinte:
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"
Alguém tem quaisquer recursos para a geração de miniaturas personalizadas se a geração falhar ou cair para trás em algo como: content_type na url padrão? Eu olhei através da fonte e não têm sido capazes de chegar a algum lugar.
Obrigado!
Solução
Eu realmente implementado este mesmo recurso. Paperclip gera thumbnails para todas as minhas imagens e PDFs, e eu adicionei costume miniatura de ícones para o MS Word, Excel, HTML, arquivos TXT etc.
A minha solução é bastante simples. No meu modelo Attachment
(no seu caso Asset
) Tenho definido o seguinte método:
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
Este retorna um URL para uma miniatura armazenados no S3, ou um caminho local para um ícone PNG genérico com base no tipo de conteúdo ativos (discutido abaixo). O método has_thumbnail?
determina se ou não este ativo teve uma miniatura gerada por ele. Isso é algo que eu adicionei em meu próprio garfo de Paperclip, mas você pode substituir em sua própria lógica (não tenho certeza do caminho 'standard' para determinar isso, talvez comparando o caminho com o caminho definido 'desaparecidos', ou mesmo apenas comparando o tipo de conteúdo a uma lista padrão [ "image / jpeg", "image / png"] etc).
De qualquer forma, aqui está o método que passa de volta um caminho para um ícone genérico com base em tanto o estilo de miniaturas (no seu caso: polegar eo: grande) e o tipo de conteúdo:
# 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
Em seguida, para adicionar uma nova miniatura I basta adicionar arquivos PNG em /images/attachments/
com a convenção de nome de arquivo correto. Meu estilo thumbail é chamado: pequeno e eu ter definido estilos para Word, Excel e texto simples para que no momento eu tenho:
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 o tipo de conteúdo não é suportado, há um genérico 'catch all' ícone que é exibido:
icon.small.default.png
Outras dicas
Você pode ter alguns tipos de arquivos herdam de seu ativo, por exemplo, Vídeo e especificar um diferente:
has_attached_file: meios, ...,: style => {....}
Tenha um olhar para este tutorial para miniaturas de vídeo .