Pregunta

Estoy utilizando Paperclip con un Ruby on Rails para adjuntar activos a un modelo, estos activos pueden ser de cualquier tipo de archivo y actualmente las miniaturas solo se generan si el activo es una imagen. Me gustaría poder mostrar una imagen predeterminada diferente para otros archivos, ya sea generando una miniatura de los archivos en la carga, o configurando algo con el default_url pero hasta ahora no puedo encontrar recursos para ayudar con esto y No estoy llegando a ningún lado por mi cuenta.

Mi modelo es el siguiente:

  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"  

¿Alguien tiene algún recurso para generar miniaturas personalizadas si la generación falla, o recurre a algo como: content_type en la URL predeterminada? He buscado en la fuente y no he podido llegar a ningún lado.

¡Gracias!

¿Fue útil?

Solución

De hecho, he implementado esta misma característica. Paperclip genera miniaturas para todas mis imágenes y archivos PDF, y he agregado íconos de miniaturas personalizados para MS Word, Excel, HTML, archivos TXT, etc.

Mi solución es bastante sencilla. En mi modelo Attachment (en su caso Asset ), he definido el siguiente 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

Esto devuelve una URL a una miniatura almacenada en S3, o una ruta local a un ícono PNG genérico basado en el tipo de contenido de los activos (descrito a continuación). El método has_thumbnail? determina si este activo ha generado o no una miniatura para él. Esto es algo que agregué en mi propia bifurcación de Paperclip, pero puede sustituirlo en su propia lógica (no estoy seguro de la forma 'estándar' de determinar esto, tal vez comparando la ruta con su ruta 'faltante' definida, o incluso simplemente comparando el tipo de contenido con una lista predeterminada [" image / jpeg " ;, " image / png "] etc).

De todos modos, aquí está el método que devuelve una ruta a un ícono genérico basado en el estilo de miniatura (en su caso: pulgar y: grande) y el tipo de contenido:

# 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

Luego, para agregar una nueva miniatura, solo agrego archivos PNG a / images / attachments / con la convención de nombre de archivo correcta. Mi estilo en miniatura se llama: small y he definido estilos para Word, Excel y texto sin formato, por lo que en este momento tengo:

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

Si el tipo de contenido no es compatible, hay un ícono genérico 'catch all' que se muestra:

icon.small.default.png

Otros consejos

Podría tener algunos tipos de archivos heredados de su Activo, por ejemplo, Video y especifique un diferente:

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

Eche un vistazo a este tutorial para miniaturas de videos .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top