faizan
faizan

Reputation: 690

Sending form data from java (image and some params) like curl

I have this to run this command which gives me right output and i want to emulate this in java using HttpUrlConnection(or any third party library)

curl http://localhost/myservice/ -v  -H 'Content-Type: multipart/form-data' -F 'file=@/home/xyz/abc.jpg' -F 'type=image' -F 'id=123'

The service accepts a file,a type and an id.

My current code looks like this-

    String urlToConnect = "http://localhost/myservice/";
    String boundary = Long.toHexString( System.currentTimeMillis() ); // Just generate some unique random value
    HttpURLConnection connection = (HttpURLConnection) new URL( urlToConnect ).openConnection();
    connection.setDoOutput( true ); // This sets request method to POST.
    connection.setRequestProperty( "Content-Type", "multipart/form-data; boundary="+boundary);
    PrintWriter writer = null;
    try
    {
    writer = new PrintWriter( new OutputStreamWriter( connection.getOutputStream(), "UTF-8" ) );

        writer.println( "--" + boundary );

        // -F type =1
        writer.println( "Content-Disposition: form-data; name=\"type\"" );
        writer.println( "Content-Type: text/plain; charset=UTF-8" );
        writer.println();
        writer.println( "image" );
        //writer.println( "--" + boundary );
        // -F id=1
        writer.println( "Content-Disposition: form-data; name=\"id\"" );
        writer.println( "Content-Type: text/plain; charset=UTF-8" );
        writer.println();
        writer.println( 123 );
        //writer.println( "--" + boundary );

        writer.println( "Content-Disposition: form-data; name=\"file\"; filename=\"abc.jpg\"" );
        writer.println( "Content-Type: image/jpeg;" );
        writer.println();
        BufferedReader reader = null;
        try
        {
            reader = new BufferedReader( new InputStreamReader( new FileInputStream(
                "/home/xyz/abc.jpg" ), "UTF-8" ) );
            for( String line; (line = reader.readLine()) != null; )
            {
                writer.println( line );
            }
        }
        finally
        {
            if( reader != null ) try
            {
                reader.close();
            }
            catch( IOException logOrIgnore )
            {
            }
        }


    }
    finally
    {
        if( writer != null ) writer.close();
    }

    // Connection is lazily executed whenever you request any status.
    int responseCode = ((HttpURLConnection) connection).getResponseCode();
    System.out.println( responseCode ); // Should be 200

    StringBuffer responseContent = new StringBuffer();
    BufferedReader rd = null;
    try
    {
        rd = new BufferedReader( new InputStreamReader( connection.getInputStream() ) );
    }
    catch( Exception e )
    {
        rd = new BufferedReader( new InputStreamReader( connection.getErrorStream() ) );
    }
    String temp = null;
    while( (temp = rd.readLine()) != null )
    {
        responseContent.append( temp );
    }

    System.out.println( "Response : " + responseContent );
}

Upvotes: 3

Views: 10447

Answers (2)

faizan
faizan

Reputation: 690

I have tried using apache httpClient for the same and now my code looks like

 HttpClient httpclient = new HttpClient();
    File file = new File( "/home/abc/xyz/solar.jpg" );

    // DEBUG
    logger.debug( "FILE::" + file.exists() ); // IT IS NOT NULL        
    try
    {
    PostMethod filePost = new PostMethod( "http://localhost/myservice/upload" );

    Part[] parts = { new StringPart( "type","image"),new StringPart( "id","1"), new FilePart( "file", file ) };
    filePost.setRequestEntity( new MultipartRequestEntity( parts, filePost.getParams() ) );

    // DEBUG


        int response = httpclient.executeMethod( filePost );
        logger.info( "Response : "+response );
        logger.info( filePost.getResponseBodyAsString());
    }
    catch( HttpException e )
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch( IOException e )
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Now then I am getting the correct response code.

Upvotes: 4

Denis Tulskiy
Denis Tulskiy

Reputation: 19167

First of all, you can not use a BufferedReader to read a jpeg image. This class is intended for reading text content only. You need to read raw bytes with FileInputStream and send them as is into the output stream you get from connection.getOutputStream(). No writers in between.

Upvotes: 2

Related Questions