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!

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top