Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 );
}
like image 899
faizan Avatar asked Aug 30 '26 09:08

faizan


2 Answers

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.

like image 65
faizan Avatar answered Sep 01 '26 00:09

faizan


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.

like image 32
Denis Tulskiy Avatar answered Aug 31 '26 22:08

Denis Tulskiy



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!