2010-04-05 15 views
6

Creo que tengo un problema de huevo y pollo. Me gustaría establecer el content_type de un archivo cargado a través de Paperclip. El problema es que el content_type predeterminado solo se basa en la extensión, pero me gustaría basarlo en otro módulo.Reemplazando content_type para Rails Paperclip plugin

que parecen ser capaz de establecer el content_type con el before_post_process

class Upload < ActiveRecord::Base 
    has_attached_file :upload 
    before_post_process :foo 

    def foo 
    logger.debug "Changing content_type" 

    #This works 
    self.upload.instance_write(:content_type,"foobar") 

    # This fails because the file does not actually exist yet 
    self.upload.instance_write(:content_type,file_type(self.upload.path) 
    end 

    # Returns the filetype based on file command (assume it works) 
    def file_type(path) 
    return `file -ib '#{path}'`.split(/;/)[0] 
    end 
end 

... Pero no puedo basar el tipo de contenido en el archivo porque Paperclip no escribe el archivo hasta after_create.

Y me parece que no puede establecer la content_type después de que se ha guardado o con la devolución de llamada after_create (incluso de vuelta en el controlador)

así que me gustaría saber si de alguna manera puedo obtener acceso al objeto real del archivo (supongamos que no hay procesadores haciendo nada en el archivo original) antes de que se guarde, de modo que pueda ejecutar el comando file_type en eso. ¿O hay una manera de modificar el content_type después de que se hayan creado los objetos?

Respuesta

4

Probablemente podría usar upload.to_file. Le proporciona un archivo temporal de clip (Paperclip::Tempfile). Tiene path propiedad, por lo que puede utilizar

self.upload.instance_write(:content_type,file_type(self.upload.to_file.path) 

Usted puede obtener utilizando Tempfileupload.to_file.to_tempfile

+1

Para llegar a la tempfile era exactamente lo que necesitaba. También lo cambié de 'before_post_process' a' before_save' – Fotios

Cuestiones relacionadas