2009-07-30 8 views
13

Uso Paperclip con Ruby on Rails para adjuntar activos a un modelo, estos activos pueden ser de cualquier tipo y actualmente solo se generan miniaturas 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 al cargarla o configurando algo con la opción default_url, pero hasta ahora no puedo encontrar ningún recurso que me ayude con esto y no puedo ir por mi cuenta.Miniaturas personalizadas para tipos de archivo con Paperclip

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" 

cualquier persona tiene los recursos para la generación de miniaturas personalizadas si falla la generación, o caer de nuevo algo como: content_type en la url por defecto? He revisado la fuente y no he podido llegar a ninguna parte.

Gracias!

Respuesta

17

De hecho, he implementado esta misma característica. Paperclip genera miniaturas para todas mis imágenes y archivos PDF, y he agregado iconos de miniaturas personalizadas 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 imagen en miniatura almacenados en S3, o una ruta de acceso local a un icono PNG genérico basado en los activos de contenido tipo (discutido a continuación). El método has_thumbnail? determina si se ha generado o no una miniatura para este elemento. Esto es algo que agregué en mi propia bifurcación de Paperclip, pero puedes sustituirlo por tu propia lógica (no estoy seguro de la manera "estándar" de determinar esto, tal vez comparando la ruta con tu camino "perdido" definido, 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 pasa de nuevo una ruta a un icono genérico basado tanto en el estilo de miniaturas (en su caso: pulgar e: 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 

A continuación, añadir una nueva miniatura Acabo de agregar archivos PNG al /images/attachments/ con la convención correcta de nombre de archivo. Mi estilo de miniatura se llama: pequeña y he definido estilos de Word, Excel y de texto plano por lo que en la actualidad 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 no se admite el tipo de contenido, hay un genérico 'coger todos' icono que se muestra:

icon.small.default.png 
+0

Awesome! Muchas gracias. Lo intentaré a primera hora de la mañana. Parece exactamente lo que estaba tratando de hacer. – Chelsea

+1

Gracias de nuevo, funcionó bien en aproximadamente 10 minutos. Realmente aprecio la ayuda. – Chelsea

+1

¡De nada! – Olly

0

Es posible que algunos tipos de archivos hereden de su activo, p. Vídeo y especificar un diferente:

has_attached_file: medios de comunicación, ...,: style => {....}

un vistazo a este tutorial para video thumbnails.

Cuestiones relacionadas