Link to home
Start Free TrialLog in
Avatar of ank5
ank5Flag for India

asked on

Receive file in Servlet

I have to write a Servlet which will get a zip file from the client. Servlet is expected to write the file to the filesystem.  

I am using Postman to simulate the request

User generated image
Below is my Servlet code

protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		try {
			String payloadRequest = getBody(request).toString();
		
			File saveFile = new File(SAVE_DIR + "abc.zip");
	        InputStream inputStream = request.getInputStream();
	        FileOutputStream outputStream = new FileOutputStream(saveFile);
	         
	        byte[] buffer = new byte[BUFFER_SIZE];
	        int bytesRead = -1;
	        System.out.println("Receiving data...");
	        
	        int len = inputStream.read(buffer);
	        System.out.println("Length - " + len);
	         
	        while (len != -1) {
	            outputStream.write(buffer, 0, len);
	            len = inputStream.read(buffer);
	        }
	         
	        System.out.println("Data received.");
	        outputStream.close();
	        inputStream.close();
	         
	        System.out.println("File written to: " + saveFile.getAbsolutePath());
	        response.getWriter().print("UPLOAD DONE");
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public static String getBody(HttpServletRequest request) throws IOException {

	    String body = null;
	    StringBuilder stringBuilder = new StringBuilder();
	    BufferedReader bufferedReader = null;

	    try {
	        InputStream inputStream = request.getInputStream();
	        if (inputStream != null) {
	            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
	            char[] charBuffer = new char[128];
	            int bytesRead = -1;
	            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
	                stringBuilder.append(charBuffer, 0, bytesRead);
	            }
	        } else {
	            stringBuilder.append("");
	        }
	    } catch (IOException ex) {
	        throw ex;
	    } finally {
	        if (bufferedReader != null) {
	            try {
	                bufferedReader.close();
	            } catch (IOException ex) {
	                throw ex;
	            }
	        }
	    }

	    body = stringBuilder.toString();
	    return body;
	}

Open in new window


This gives me the below error
java.io.IOException: Stream closed
	at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:312)
	at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167)
	at com.emc.stream.servlets.UploadParcels.doPost(UploadParcels.java:116)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

Open in new window


What would be the correct way to receive file from the client and save it on the server?

Thank you
ASKER CERTIFIED SOLUTION
Avatar of mccarl
mccarl
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial