2011-01-30 18 views
6

Tengo una imagen en forma de una matriz de bytes en java. Estoy intentando subir esa imagen a mi aplicación Ruby on Rails, que hace uso de la gema Paperclip. Mi modelo rieles se ve así:HTTP-POST una imagen a la aplicación Ruby on Rails

class App < ActiveRecord::Base 
    has_attached_file :image 
end 

Cuando ejecuto el código java, me sale mi respuesta HHTTP/1.1 302 Found carriles de aplicación. Método actualizado HTTP-Post de Java. Aquí está el nuevo código java que estoy usando para 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()); 
} 

Aquí está la nueva depuración en la consola de rieles:

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 

Cargar imágenes directamente desde el navegador funciona como un encanto. Aquí está la implementación del controlador/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 

Dónde estoy haciendo mal?

+0

¿Qué biblioteca HTTP está utilizando? –

+0

Apache Commons HTTPClient 4.1 – Raunak

+0

De los registros parece que se está insertando una entrada a la base de datos y el archivo adjunto se está guardando, ¿puede confirmar si ese es el caso o no? Y también sería interesante ver la acción crear en AppsController, ¿puedes incluir eso en tu pregunta también? – DanneManne

Respuesta

2

Creo que el problema es que intentas crear la aplicación con params [: app] cuando no hay parámetros llamados app, only image. Creo que el siguiente en su acción create debe trabajar en su lugar:

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

Otra cosa buena puede ser agregar la siguiente validación de su modelo de aplicación para asegurarse de que un registro no se guarda en la base de datos si no hay imagen se guardó .

validates_attachment_presence :image 
+0

Gracias DanneManne. – Raunak

Cuestiones relacionadas