2010-04-05 8 views
6

Ich denke, ich habe ein bisschen ein Huhn und Ei Problem. Ich möchte den content_type einer über Paperclip hochgeladenen Datei festlegen. Das Problem ist, dass der Standardinhaltstyp nur auf der Erweiterung basiert, aber ich möchte ihn auf einem anderen Modul basieren.Overriding content_type für Rails Paperclip plugin

Ich scheine die content_type mit dem before_post_process in der Lage sein zu setzen

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 

Aber ... Ich kann nicht den Inhaltstyp auf die Datei stützen, da Paperclip nicht die Datei bis after_create schreiben.

Und ich kann nicht die content_type zu setzen scheinen, nachdem sie die after_create Rückruf (auch wieder in der Steuerung)

So gespeichert oder mit wurde ich möchte wissen, ob ich irgendwie Zugriff auf die eigentliche Datei-Objekt bekommen (Angenommen, es gibt keine Prozessoren, die irgendetwas mit der Originaldatei tun, bevor sie gespeichert werden, damit ich den Befehl file_type ausführen kann.) Oder gibt es eine Möglichkeit, den content_type zu ändern, nachdem die Objekte erstellt wurden.

Antwort

4

Wahrscheinlich könnten Sie verwenden. Es gibt Ihnen eine temporäre Büroklammerdatei (Paperclip::Tempfile). Es hat path Eigenschaft, so dass Sie

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

Sie können Tempfileupload.to_file.to_tempfile

+1

Anfahrt zum tempfile mit bekommen können war genau das, was ich brauchte. Ich habe es auch von 'before_post_process' in' before_save' geändert – Fotios