2012-12-28 24 views
6

Sto lavorando su un API REST, cercando di caricare una foto di utente con:upload di file con l'uva e graffetta

  • grape micro-quadro
  • paperclip gioiello, ma non funziona, che mostra questo errore
  • rotaie versione è 3.2.8

No handler found for #<Hashie::Mash filename="user.png" head="Content-Disposition: form-data; name=\"picture\"; filename=\"user.png\"\r\nContent-Type: image/png\r\n" name="picture" tempfile=#<File:/var/folders/7g/b_rgx2c909vf8dpk2v00r7r80000gn/T/RackMultipart20121228-52105-43ered> type="image/png">

ho provato il test graffetta con un controller e ha funzionato, ma quando provo a caricare tramite API uva non il suo lavoro il mio colpo di testa post è multipart/form-data

Il mio codice per l'upload è questo

user = User.find(20) 
user.picture = params[:picture] 
user.save! 

Quindi, se non è possibile caricare file tramite uva, esiste un modo alternativo per caricare file tramite REST API?

risposta

2

È possibile passare l'oggetto File avete ottenuto in params[:picture][:tempfile] come Paperclip ottenuto un adattatore per File oggetti, come questo

user.picture = params[:picture][:tempfile] 
user.picture_file_name = params[:picture][:filename] # Preserve the original file name 
+0

Questo non ha funzionato: http://stackoverflow.com/qu estions/15354699/how-do-you-upload-a-file-with-paperclip-without-rails – Chloe

14

@ Ahmad-Sherif opere soluzione, ma si original_filename sciolti (ed estensione) e in grado di fornire probemi con preprocessori e validatori. È possibile utilizzare ActionDispatch::Http::UploadedFile come questo:

desc "Update image" 
    params do 
    requires :id, :type => String, :desc => "ID." 
    requires :image, :type => Rack::Multipart::UploadedFile, :desc => "Image file." 
    end 
    post :image do 
    new_file = ActionDispatch::Http::UploadedFile.new(params[:image]) 
    object = SomeObject.find(params[:id]) 
    object.image = new_file 
    object.save 
    end 
+0

Ha funzionato come fascino ... –

+0

Finalmente, funziona. Grazie. – Pierre

+0

facile e ha funzionato come fascino anche con carrierwave! – Carlosin

8

Forse un modo più coerente per fare questo sarebbe di definire adattatore graffetta per Hashie :: Mash

module Paperclip 
    class HashieMashUploadedFileAdapter < AbstractAdapter 

    def initialize(target) 
     @tempfile, @content_type, @size = target.tempfile, target.type, target.tempfile.size 
     self.original_filename = target.filename 
    end 

    end 
end 

Paperclip.io_adapters.register Paperclip::HashieMashUploadedFileAdapter do |target| 
    target.is_a? Hashie::Mash 
end 

e usarlo "trasparente"

user = User.find(20) 
user.picture = params[:picture] 
user.save! 

aggiunto a wiki - https://github.com/intridea/grape/wiki/Uploaded-file-and-paperclip

+0

Dove lo mettiamo esattamente? – sunnyrjuneja

+1

dipende. puoi mettere questo codice in 'config/initializers/paperclip_hashie_mash_adapter.rb' per l'uva su binari. o utilizzare dovrebbe occupare simile per uva sul rake: metterlo a 'lib/paperclip_hashie_mash_adapter.rb' e richiedono dopo le dipendenze di applicazioni caricate, ma prima dell'inizio dell'applicazione (' config/application.rb' per esempio) –

+0

Grazie, che era disponibile. Sto usando Grape montato su Rails, quindi ho appena creato un inizializzatore. – sunnyrjuneja