Reputation: 690
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
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
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