cham3333
cham3333

Reputation: 103

Java Restful web service method to consume MultiPart data throwing exception

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.

Upvotes: 1

Views: 2700

Answers (3)

srikanth kumar
srikanth kumar

Reputation: 39

Check in Eclipse whether Dynamic web Module version is 2.5 or 3.0. I think multipart works only in 3.0 or higher. Please let me know what is the version.

Upvotes: -1

Dickens A S
Dickens A S

Reputation: 4054

You can use FormDataMultiPart

@POST
@Path("/coverpic")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(FormDataMultiPart multiPart){
     FormDataBodyPart body = multiPart.getField(<your fieldname>);
     InputStream ins = ((BodyPartEntity) body.getEntity()).getInputStream();
     ///.....
     ///.....
     return Response.status(200).entity(output).build();

}

Please check your field name "file" is really coming in the multipart otherwise loop through multiPart and get all the field names using

multiPart.getFields().keySet().iterator()

You have to use multipart dependencies

<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-multipart</artifactId>
    <version>1.18.3</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

Upvotes: 1

ajitksharma
ajitksharma

Reputation: 2019

Use uploadFile method something like this:

public Response uploadFile(
        @DefaultValue("true") @FormDataParam("enabled") boolean enabled,
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail)
{
//Your code
}

here logic is making FormDataParam set to true.

Here is one my answer with server as well as client code, might be of your help

File Upload with Jax RS

Upvotes: 1

Related Questions