Home > OS >  How do i parse content sent from multipart/form-data request to get file in java?
How do i parse content sent from multipart/form-data request to get file in java?

Time:01-26

I am sending a HttpURLConnection request to server and trying to send a file. I am able to send file from client side but not sure how can i parse it on the server side.

My code on client side is below.

private void createRequestInCHESS(String sRequestId, String sLastUpdated) {
        String boundary =  "xyz";
        String crlf = "\r\n";
        String twoHyphens = "--";
        String attachmentName = "file";
        String attachmentFileName = "testFile.xlsx";
        try {
            File file = new File("c:\\MFGREQ-7.xlsx");
            URL url = new URL(chess.getMfgRequestURL()   "/createRequest");
            HttpURLConnection httpConnecton = (HttpURLConnection) url.openConnection();
            httpConnecton.setRequestMethod(REQUEST_METHOD_POST);
            httpConnecton.setRequestProperty("Accept", "application/json");
            httpConnecton.setRequestProperty("Cache-Control", "no-cache");
            httpConnecton.setRequestProperty("Content-Type", "multipart/form-data;boundary="   boundary);
            httpConnecton.setRequestProperty("id", sRequestId);
            httpConnecton.setRequestProperty("lastModified", sLastUpdated);     
                        
            httpConnecton.setDoOutput(true);
                
            
            
            DataOutputStream outStream = new DataOutputStream(httpConnecton.getOutputStream());
            outStream.writeBytes(twoHyphens   boundary   crlf);
            outStream.writeBytes("Content-Disposition: form-data; name=\""  
                attachmentName   "\";filename=\""   attachmentFileName   "\""   crlf);
            outStream.writeBytes(crlf);
            
            byte[] bytes = Files.readAllBytes(file.toPath());
            outStream.write(bytes);
            
            outStream.flush();
            outStream.close();
            getResponseString(httpConnecton);
            
        } catch (MalformedURLException me) {
            me.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

server side code is given below. What can I use to retrive file sent from request.

@POST
    @Path("/createRequest")
    public Response createRequest(@Context HttpServletRequest request) {

        try(BufferedReader reader = new BufferedReader(
                new InputStreamReader(request.getInputStream()))) {             
            StringBuilder sbPayload = new StringBuilder();
            String sLine;
            while ((sLine = reader.readLine()) != null) {
                sbPayload.append(sLine);
                sbPayload.append(System.lineSeparator());
            }

            String data = sbPayload.toString();

          // how do i retrieve file here ?

}

CodePudding user response:

You really don't want to parse that yourself. Use the https://commons.apache.org/proper/commons-fileupload/

Then you can just write.

DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8"); // Might be needed, depending on exact setup.
java.util.List<FileItem> items = upload.parseRequest(request);

And then items is the list of uploaded files.

CodePudding user response:

Here is my answer. I have used org.glassfish.jersey.media.multipart.MultiPart on client side.

    Client client = ClientBuilder.newBuilder().register(MultiPartFeature.class).build();
            WebTarget webTarget = client.target(chess.getMfgRequestURL()   "/createRequest");
            
            FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
                    file, MediaType.APPLICATION_OCTET_STREAM_TYPE);
            @SuppressWarnings("resource")
            MultiPart multiPart = new FormDataMultiPart()
                    .field("json", jsonObj, MediaType.APPLICATION_JSON_TYPE) // json goes here
                    .bodyPart(fileDataBodyPart); // file goes here
            
            multiPart.bodyPart(fileDataBodyPart);
            
            Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE)
                      .post(Entity.entity(multiPart, multiPart.getMediaType()));

On server side, this is how I have parsed:

 @POST
    @Path("/createRequest")
    @Consumes("multipart/form-data")
    public Response createRequest(@Context HttpServletRequest request,  @Multipart InputStream uploadedInputStream) throws Exception {
        JsonObjectBuilder requestBuilder = null;
        try {
            
            String tempDir = "C:\\Users";
            String filename = "test.xlsx";

            File checkinFile = new File(tempDir, filename);
            OutputStream out = new FileOutputStream(checkinFile);
            IOUtils.copyStream(uploadedInputStream, out);        
        }catch (Exception e) {
            String errorMessage = e.getMessage();
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorMessage).build();
        }
  • Related