2011-09-22 21 views
7

quiero crear 1 cargador para múltiples tipos de archivos (imágenes, PDF, vídeo)CarrierWave: crear 1 cargador para múltiples tipos de archivos

Para cada content_type voluntad diferentes acciones

¿Cómo puedo definir lo content_type del archivo?

Por ejemplo:

if image? 
    version :thumb do 
    process :proper_resize  
    end 
elsif video? 
    version :thumb do 
    something 
    end 
end 

Respuesta

9

me encontré con esto, y parece que un ejemplo de cómo resolver este problema: https://gist.github.com/995663.

El cargador se carga primero cuando llama al mount_uploader, punto en el que cosas como if image? o elsif video? no funcionarán, porque todavía no hay archivos para cargar definidos. Necesitarás los métodos a los que se llama cuando se crea una instancia de la clase.

Lo que el enlace que he dado anterior, es reescribir el método process, de modo que tome una lista de extensiones de archivos y procesos sólo si el archivo coincide con una de esas extensiones

# create a new "process_extensions" method. It is like "process", except 
# it takes an array of extensions as the first parameter, and registers 
# a trampoline method which checks the extension before invocation 
def self.process_extensions(*args) 
    extensions = args.shift 
    args.each do |arg| 
    if arg.is_a?(Hash) 
     arg.each do |method, args| 
     processors.push([:process_trampoline, [extensions, method, args]]) 
     end 
    else 
     processors.push([:process_trampoline, [extensions, arg, []]]) 
    end 
    end 
end 

# our trampoline method which only performs processing if the extension matches 
def process_trampoline(extensions, method, args) 
    extension = File.extname(original_filename).downcase 
    extension = extension[1..-1] if extension[0,1] == '.' 
    self.send(method, *args) if extensions.include?(extension) 
end 

A continuación, puede utilizar esto para llamar a lo que solía ser procesar

IMAGE_EXTENSIONS = %w(jpg jpeg gif png) 
DOCUMENT_EXTENSIONS = %(exe pdf doc docm xls) 
def extension_white_list 
    IMAGE_EXTENSIONS + DOCUMENT_EXTENSIONS 
end 

process_extensions IMAGE_EXTENSIONS, :resize_to_fit => [1024, 768] 

para las versiones, hay una página en el wiki carrierwave que le permite condicionalmente versiones de proceso, si se encuentra en> 0.5.4. https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing. Vas a tener que cambiar el código de la versión a tener este aspecto:

version :big, :if => :image? do 
    process :resize_to_limit => [160, 100] 
end 

protected 
def image?(new_file) 
    new_file.content_type.include? 'image' 
end 
+0

pude probarlo ... Voy a actualizar mi respuesta – keithepley

+0

Otra actualización ... descubierto la manera de cuidar de forma selectiva creando versiones – keithepley

+0

¡Impresionante! ¡Gracias! – manzhikov

Cuestiones relacionadas