Ankita Jain
Ankita Jain

Reputation: 13

passing InputStream as parameter to web service

I am trying to upload file but i am not doing it through html form. QueryParam and PathParam can't be used. So can anyone tell how to pass stream.

My HttPClient looks like:

try
    {
        HttpClient httpclient = new DefaultHttpClient();
        InputStream stream=new FileInputStream(new File("C:/localstore/ankita/Desert.jpg"));
        String url="http://localhost:8080/Cloud/webresources/fileupload";
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
    }
    catch(Exception e){}

and my web service class looks somewhat like:

@Path("/fileupload")
public class UploadFileService {

@POST
@Consumes(MediaType.APPLICATION_OCTET_STREAM)

public Response uploadFile(InputStream in) throws IOException
{     
    String uploadedFileLocation = "c://filestore/Desert.jpg" ;

    // save it
    saveToFile(in, uploadedFileLocation);

    String output = "File uploaded via Jersey based RESTFul Webservice to: " + uploadedFileLocation;

    return Response.status(200).entity(output).build();

}

// save uploaded file to new location
private void saveToFile(InputStream uploadedInputStream,String uploadedFileLocation) 
{
    try {
        OutputStream out = null;
        int read = 0;
        byte[] bytes = new byte[1024];

        out = new FileOutputStream(new File(uploadedFileLocation));
        while ((read = uploadedInputStream.read(bytes)) != -1) 
        {
            out.write(bytes, 0, read);
        }
        out.flush();
        out.close();
    } catch (IOException e) 
    {
        e.printStackTrace();
    }

}

}

Can anyone help??

 String url="http://localhost:8080/Cloud/webresources/fileupload";
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        InputStreamEntity reqEntity = new InputStreamEntity(new FileInputStream(new File("C:/localstore/ankita/Desert.jpg")), -1);
        reqEntity.setContentType("binary/octet-stream");
        reqEntity.setChunked(true); // Send in multiple parts if needed
        httppost.setEntity(reqEntity);
        HttpResponse response = httpclient.execute(httppost);   

How web service will look like?

Upvotes: 0

Views: 7221

Answers (1)

Stephen C
Stephen C

Reputation: 718738

You can't do it that way. You can't pass a stream in an HTTP request, because streams are not serializable.

The way to do this is to is create an HttpEntity to wrap the stream (e.g. an InputStreamEntity) then attach it to the HttpPOST object using setEntity. Then the POST is sent, the client will read from your stream and send the bytes as the request's "POST data".

Upvotes: 1

Related Questions