2010-04-05 19 views
6

Sanırım biraz tavuk ve yumurta problemim var. Paperclip aracılığıyla yüklenen bir dosyanın content_type değerini ayarlamak istiyorum. Sorun şu ki, varsayılan içerik_türü sadece uzantıya dayanıyor, ancak bunu başka bir modüle dayandırmak istiyorum.Rails Paperclip eklentisi için içerik_türü geçersiz kılma

Ben 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 

ile CONTENT_TYPE içerik ayarlamak mümkün görünmektedir Ama Paperclip after_create kadar dosyayı yazmaz çünkü ... Ben dosyada içerik türünü temel olamaz.

Ve (denetleyici bile arka) kaydedilmiş veya after_create geri arama ile edildikten sonra ben nasılsa gerçek dosya nesnesine erişim sağlayabilmesi halinde

yüzden bilmek istiyorum CONTENT_TYPE içerik ayarlamak gibi olamaz (kaydedilmeden önce orijinal dosyaya herhangi bir işlem yapmaz) varsa, bunun üzerine file_type komutunu çalıştırabilirim. Veya nesneler oluşturulduktan sonra content_type değiştirmenin bir yolu var.

cevap

4

Muhtemelen upload.to_file'u kullanabilirsiniz. Bu size ataç geçici dosya verir (Paperclip::Tempfile). Eğer

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

kullanabilirsiniz böylece Sen tam olarak ne ihtiyaç vardı TempFile Ulaşım upload.to_file.to_tempfile

+1

kullanarak Tempfile alabilirsiniz path özelliğine sahiptir. Ayrıca 'before_post_process' ile' before_save' arasında değiştirdim. – Fotios