2010-04-05 9 views
6

Myślę, że mam problem z kurczakiem i jajkiem. Chciałbym ustawić content_type pliku przesłanego za pomocą Paperclip. Problem polega na tym, że domyślny content_type jest oparty tylko na rozszerzeniu, ale chciałbym oprzeć go na innym module.Zastępowanie content_type dla Rails Paperclip plugin

wydaje mi się, aby móc ustawić content_type z 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 

... Ale nie mogę oprzeć typ zawartości na plik ponieważ Spinacz nie pisze plik aż after_create.

I nie wydają się ustawić content_type po to zostało zapisane lub z after_create zwrotnego (nawet z powrotem w sterowniku)

Więc chciałbym wiedzieć, czy mogę jakoś uzyskać dostęp do rzeczywistego obiektu pliku (załóżmy, że żaden procesor nie robi nic w oryginalnym pliku) przed jego zapisaniem, tak że mogę uruchomić polecenie file_type. Czy istnieje sposób modyfikowania content_type po utworzeniu obiektów.

Odpowiedz

4

Prawdopodobnie można użyć upload.to_file. To daje tymczasowy plik spinacza (Paperclip::Tempfile). Ma path nieruchomości, dzięki czemu można używać

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

Można uzyskać Tempfile użyciu upload.to_file.to_tempfile

+1

dojazd do pliku tymczasowego było dokładnie to, czego potrzebowałem. Zmieniłem go również z 'before_post_process' na' before_save' – Fotios