2010-04-05 13 views
6

Penso di avere un po 'di problemi con uova e galline. Vorrei impostare content_type di un file caricato tramite Paperclip. Il problema è che il content_type predefinito è basato solo sull'estensione, ma mi piacerebbe basarlo su un altro modulo.Overriding content_type for Rails Plug-in Paperclip

Mi sembra di essere in grado di impostare la content_type con l'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 

Ma ... io non può basare il tipo di contenuto sul file perché Paperclip non scrive il file fino after_create.

E io non riesco a impostare il content_type dopo che è stato salvato o con la richiamata after_create (anche indietro nel controllore)

quindi vorrei sapere se posso in qualche modo ottenere l'accesso all'oggetto file effettivo (supponiamo che non ci siano processori che stanno facendo qualcosa per il file originale) prima che sia salvato, in modo che possa eseguire il comando file_type su quello. O c'è un modo per modificare il content_type dopo che gli oggetti sono stati creati.

risposta

4

Probabilmente è possibile utilizzare upload.to_file. Ti dà il file temporaneo graffetta (Paperclip::Tempfile). Ha path proprietà, in modo da poter utilizzare

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

È possibile ottenere Tempfile usando upload.to_file.to_tempfile

+1

Arrivare al tempfile era esattamente quello che mi serviva. Ho anche cambiato da 'before_post_process' a' before_save' – Fotios

Problemi correlati