I am trying to upload image from android device to server. My Web Service method is getting invoked but it is throwing some exception. I tried searching net for hours but I didn't find any solution to this. I am using multipart for first time. I have changed my web service method.[edited] Here is my android client code
protected Boolean doInBackground(String... urls) {
try{
URL urlImage = new URL("http://10.0.2.2:8080/LostLove_services/love/Recipe/coverpic");
HttpURLConnection urlConnectionImage = (HttpURLConnection) urlImage.openConnection();
ImageButton coverImage = (ImageButton)findViewById(R.id.CoverPic);
Bitmap bitmap = ((BitmapDrawable)coverImage.getDrawable()).getBitmap();
urlConnectionImage.setUseCaches(false);
urlConnectionImage.setDoOutput(true);
urlConnectionImage.setDoInput(true);
urlConnectionImage.setRequestMethod("POST");
urlConnectionImage.setRequestProperty("Connection", "Keep-Alive");
urlConnectionImage.setRequestProperty("Cache-Control", "no-cache");
urlConnectionImage.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + this.boundary);
DataOutputStream request = new DataOutputStream(urlConnectionImage.getOutputStream());
request.writeBytes(this.twoHyphens + this.boundary + this.crlf);
request.writeBytes("Content-Disposition: form-data; name=\"" + this.attachmentName + "\";filename=\"" + this.attachmentFileName + "\"" + this.crlf);
request.writeBytes(this.crlf);
/* byte[] pixels = new byte[bitmap.getWidth() * bitmap.getHeight()];
for (int i = 0; i < bitmap.getWidth(); ++i) {
for (int j = 0; j < bitmap.getHeight(); ++j) {
//we're interested only in the MSB of the first byte,
//since the other 3 bytes are identical for B&W images
pixels[i + j] = (byte) ((bitmap.getPixel(i, j) & 0x80) >> 7);
}
}
*/
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
// Log.d("pixel size",pixels.clone().toString());
// Log.d("real size",Integer.toString(pixels.length));
request.write(bitmapdata);
request.writeBytes(this.crlf);
request.writeBytes(this.twoHyphens + this.boundary + this.twoHyphens + this.crlf);
request.flush();
Log.d("imageout",Integer.toString(urlConnectionImage.getResponseCode()));
request.close();
switch (urlConnection.getResponseCode()) {
case HttpURLConnection.HTTP_OK:
return true;
default:
return false; // abort
}
// urlConnection.connect();
}
catch (Exception e)
{
Log.d("exeJsonPublish",e.toString());
return false;
}
}
Here is my web service method[EDITED]. I am getting null value in Buffered Image.
@Path("/coverpic")
@POST
// @Consumes("multipart/form-data")
public String retrieveImage(FormDataMultiPart multipart)
{
Iterator it = multipart.getFields().keySet().iterator();
//System.out.println(it.next());
FormDataBodyPart body = multipart.getField("bitmap");
InputStream ins = ((BodyPartEntity )body.getEntity()).getInputStream();
String uploadedFileLocation = "E:\\torr\\A.bmp" ;
if(ins == null)
System.out.println("is null");
// writeToFile(ins, uploadedFileLocation);
try {
BufferedImage bi = ImageIO.read(ins);
if(bi==null)
System.out.println("bi is null");
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("exec is "+e);
}
// System.out.println(multipart.getFields().keySet().iterator());
/*try {
InputStream source = ins;
//BufferedImage bi = ImageIO.(source);
BufferedImage bi = ImageIO.read(source);
File file = new File("E:\\aditya.bmp");
if (file.isDirectory()) {
ImageIO.write(bi, "bmp", file);
} else {
file.mkdirs();
ImageIO.write(bi, "bmp", file);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.println("in retrieveImage"+ multipart.getBodyParts());
return null;
}
I have corrected my code. Now it is working. Bitmap was not getting created properly in android doInBackground Method.
You can use FormDataMultiPart
Please check your field name "file" is really coming in the multipart otherwise loop through multiPart and get all the field names using
You have to use multipart dependencies