2011-12-20 15 views
7

Estoy utilizando CarrierWave para mis cargas de archivos en Rails 3.1, y estoy buscando una forma de ahorrar espacio en el servidor. Muchas de las fotos que se suben tienen más de 20 MB, por lo que después de procesarlas hasta 1024 x 1024, me gustaría eliminar el original. ¿Hay alguna manera fácil de hacerlo en la clase de subida?¿Cómo puedo hacer que carrierwave no guarde el archivo original después de procesar las versiones?

Gracias, --Mark

+0

hicieron mis trabajos solución para usted? – Lichtamberg

Respuesta

3

Se podría definir una devolución de llamada after_save en modelar y eliminar la foto ..

no sé el modelo, pero algo como esto puede funcionar si personalizarlo:

class User << ActiveRecord::Base 

    after_create :convert_file 
    after_create :delete_original_file 

    def convert_file 
    # do the things you have to do 
    end 

    def delete_original_file 
    File.delete self.original_file_path if File.exists? self.original_file_path 
    end 
end 
+0

podría darnos algún ejemplo de trabajo? –

+0

Agregó un ejemplo – Lichtamberg

+0

¿Funcionó para usted? Si es así, sería bueno si marca mi respuesta, pregunte correctamente. – Lichtamberg

1
class FileUploader < CarrierWave::Uploader::Base 

    after :store, :delete_original_file 

    def delete_original_file(new_file) 
    File.delete path if version_name.blank? 
    end 

    include CarrierWave::RMagick 

    storage :file 
    . 
    . # other configurations 

end 
22

que solía tener dos versiones y se dio cuenta de que yo no no necesito el original

Así que en lugar de tener

version :thumb do 
    process :resize_to_limit => [50, 50] 
    end 

version :normal do 
    process :resize_to_limit => [300,300] 
end 

me eliminado: normal y añadido este

process :resize_to_limit => [300, 300] 

Ahora el original se guarda en el tamaño que necesito y no tengo una tercera imagen no utilizada en el servidor

+1

increíble, creo que esta es una gran solución para simplemente hacer un proceso fuera de cualquier bloque de versión para que no guarde la versión original en absoluto si es realmente grande. gracias – FireDragon

+1

Me gustaría agregar que si aún desea incluir '" normal_ "' en el nombre del archivo cargado, como ocurriría en un bloque 'version', puede asignar explícitamente un nombre de versión al cargador de base usando 'version_names <<: medium'. –

7

todos! La solución seleccionada no funciona para mí. Mi solución:

after :store, :remove_original_file 

    def remove_original_file(p) 
    if self.version_name.nil? 
     self.file.delete if self.file.exists? 
    end 
    end 
+1

¡Gracias, te mereces una galleta! –

0

Es un pequeño truco poco, pero tiene la ventaja de rendimiento

my_uploader.send :store_versions!, open(my_file) 
Cuestiones relacionadas