2011-01-30 1 views
6

Ho un'immagine sotto forma di un array di byte in java. Sto cercando di caricare quell'immagine nella mia app Ruby on Rails, che utilizza la gemma Paperclip. Il mio modello Rails si presenta così:HTTP-POST un'immagine a Ruby on Rails app

class App < ActiveRecord::Base 
    has_attached_file :image 
end 

Quando eseguo il codice Java, ottengo risposta HHTTP/1.1 302 Found mia applicazione Rails. Metodo java HTTP-Post aggiornato. Ecco il nuovo codice Java che sto usando per HTTP-Post:

public void postFile(byte[] image) throws ClientProtocolException, IOException{ 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
    HttpPost httppost = new HttpPost("http://localhost:3000/apps"); 

    ContentBody cb = new ByteArrayBody(image, "image/jpg", "icon.jpg"); 
    //ContentBody cb = new InputStreamBody(new ByteArrayInputStream(image), "image/jpg", "icon.jpg"); 

    MultipartEntity mpentity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    mpentity.addPart("image", cb); 
    httppost.setEntity(mpentity); 

    HttpResponse response = httpclient.execute(httppost); 
    System.out.println(response.getStatusLine()); 
} 

Ecco il nuovo di debug sulla console rotaie:

Started POST "/apps" for 127.0.0.1 at Mon Jan 31 00:26:07 +0000 2011 
Processing by AppsController#create as HTML 
Parameters: {"image"=>#<ActionDispatch::Http::UploadedFile:0x1041491c8 @content_type=nil, @original_filename="icon.jpg", @headers="Content-Disposition: form-data; name=\"image\"; filename=\"icon.jpg\"\r\n", @tempfile=#<File:/var/folders/NU/NUcfnxwVHmmnVUo9JUdNok+++TI/-Tmp-/RackMultipart20110131-3735-1ylugl7-0>>} 
SQL (0.1ms) BEGIN 
SQL (1.0ms) describe `apps` 
AREL (0.4ms) INSERT INTO `apps` (`appName`, `image_file_size`, `created_at`, `image_updated_at`, `image_file_name`, `image_content_type`, `updated_at`) VALUES (NULL, NULL, '2011-01-31 00:26:07', NULL, NULL, NULL, '2011-01-31 00:26:07') 
[paperclip] Saving attachments. 
SQL (1.3ms) COMMIT 
Redirected to http://localhost:3000/apps/36 
Completed 302 Found in 18ms 

immagini Caricamento direttamente dal browser funziona come un fascino. Ecco l'implementazione di controller/apps_controller.rb:

def create 
    @app = App.new(params[:app]) 

    respond_to do |format| 
    if @app.save 
     format.html { redirect_to(@app, :notice => 'App was successfully created.') } 
     format.xml { render :xml => @app, :status => :created, :location => @app } 
     format.json { render :json => @app, :status => :created, :location => @app }   
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @app.errors, :status => :unprocessable_entity } 
     format.json { render :json => @app.errors, :status => :unprocessable_entity }   
    end 
    end 
end 

Dove sto andando male?

+0

Cosa libreria HTTP stai usando? –

+0

Apache Commons HTTPClient 4.1 – Raunak

+0

Dai log sembra che una voce sia stata inserita nel db e che l'allegato sia stato salvato, puoi confermare se questo è il caso o no? E sarebbe anche interessante vedere l'azione di creazione in AppsController, puoi includerlo anche nella tua domanda? – DanneManne

risposta

2

Penso che il problema è che si tenta di creare l'App con params [: app] quando non ci sono parametri denominati app, solo immagine. Credo che il seguente nella vostra azione creare dovrebbe funzionare invece:

@app = App.new(:image => params[:image]) 

Un altro aspetto positivo può essere quello di aggiungere la seguente convalida nel modello App per assicurarsi che un record non viene salvato nel database se nessuna immagine è stata salvata .

validates_attachment_presence :image 
+0

Grazie DanneManne. – Raunak