Jersey Image Upload Client
Asked Answered
P

1

6

I am trying to upload image using Jersey webservice , i am using jersey client to upload image. below is jersey web service which takes inputstream and uploads image on server. it works fine when i directly call it using jsp multipart form upload but fails when i upload images using jersey client

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
        @FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("file") FormDataContentDisposition fileDetail) throws ServiceException
{
    // upload code
}

Below is Jersey Client to upload Image, the client code is part of another web service which is called from php rest client and this jersey client call to jersey web service to upload image, if i directly call jersey web service to upload image that work's fine but it is not working when i upload using jersey client.

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
client.setChunkedEncodingSize(1024);
WebResource wr = client
        .resource("http://localhost:8080/rest/upload");

String contentDisposition = "attachment; filename=\""
        + fileDetail.getName() + "\"";
FormDataMultiPart form = new FormDataMultiPart();
ContentDisposition contentDisposition2 = new ContentDisposition(contentDisposition);
form.setContentDisposition(contentDisposition2);
FormDataBodyPart fdp = new FormDataBodyPart("file",
        uploadedInputStream, MediaType.MULTIPART_FORM_DATA_TYPE);
form.bodyPart(fdp);
ClientResponse response = wr.type(MediaType.MULTIPART_FORM_DATA).post(
        ClientResponse.class, form)

Please help me not sure what i am missing here. Thanks.

Patronize answered 9/1, 2015 at 11:51 Comment(4)
Can you clarify what "not working" means? I tested with your exact code, using FileInputStream type for uploadedInputStream and it works fine. One thing I would change (though it didn't cause it to fail for me) is MediaType.MULTIPART_FORM_DATA_TYPE for fdp to MediaType.APPLICATION_OCTET_STREAM_TYPEMane
I mean it is passing uploadedInputStream to jersey webservice but it does not contains same chunks and same content type which we passed from jersey client.Patronize
form-data is the main content type of the request. But the form-data comes with parts and each part has it's own content type. The file should be octet-stream and not form-dataMane
@peeskillet, you are right it should be MediaType.APPLICATION_OCTET_STREAM_TYPEPatronize
D
11

Here is a full example to upload an image using jersey client and webservice the client code

public class Test {

    private static URI getBaseURI() {
        return UriBuilder.fromUri("http://localhost:8080/restfullwebservice/resources/generic").build("");
    }

    public static void main(String[] args) throws FileNotFoundException {
        final ClientConfig config = new DefaultClientConfig();
        final Client client = Client.create(config);

        final WebResource resource = client.resource(getBaseURI()).path("upload");

        final File fileToUpload = new File("C:/Users/Public/Pictures/Desert.jpg");

        final FormDataMultiPart multiPart = new FormDataMultiPart();
        if (fileToUpload != null) {
            multiPart.bodyPart(new FileDataBodyPart("file", fileToUpload,
                    MediaType.APPLICATION_OCTET_STREAM_TYPE));
        }

        final ClientResponse clientResp = resource.type(
                MediaType.MULTIPART_FORM_DATA_TYPE).post(ClientResponse.class,
                multiPart);
        System.out.println("Response: " + clientResp.getClientResponseStatus());

        client.destroy();
    }
}

the webservice server code

@POST
@Path("upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadFile(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) throws ServiceChannelException {
    OutputStream os = null;
    try {
        File fileToUpload = new File("C:/Users/Public/Pictures/Desert1.jpg");
        os = new FileOutputStream(fileToUpload);
        byte[] b = new byte[2048];
        int length;
        while ((length = uploadedInputStream.read(b)) != -1) {
            os.write(b, 0, length);
        }
    } catch (IOException ex) {
        Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            os.close();
        } catch (IOException ex) {
            Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Full application https://github.com/abdotalaat/upladeimageusingjersy

Dermoid answered 9/1, 2015 at 13:11 Comment(2)
every thing is ok with you? note that the full project is Netbeans projectDermoid
Ohh i see, i never tried with netbeans but now i will try it. Thanks for your help.Patronize

© 2022 - 2024 — McMap. All rights reserved.