How to Download and Fill Out Form and Upload Again

Servlet Upload File and Download File is a mutual task in java web awarding. Since I have written a lot about java servlet recently, I thought to provide a sample example of servlet file upload to server and then download from server to client.

Servlet Upload File

Our utilize case is to provide a simple HTML page where client can select a local file to exist uploaded to server. On submission of request to upload the file, our servlet program will upload the file into a directory in the server so provide the URL through which user tin can download the file. For security reason, user will not exist provided straight URL for downloading the file, rather they will be given a link to download the file and our servlet will process the request and send the file to user.

We will create a dynamic web projection in Eclipse and the projection structure will look like below image.

Servlet Upload File, java upload file to server, servlet download file

Let's wait into all the components of our web awarding and understand the implementation.

HTML Folio for Coffee Uploading File to Server

We can upload a file to server past sending a post request to servlet and submitting the form. We can't use GET method for uploading file.

Another point to note is that enctype of form should be multipart/course-data.

To select a file from user file organisation, we demand to use input chemical element with type as file.

So we can accept a simple HTML page index.html for uploading file as:

                          <html> <head></head> <body> <grade action="UploadDownloadFileServlet" method="post" enctype="multipart/form-information"> Select File to Upload:<input type="file" name="fileName"> <br> <input type="submit" value="Upload"> </course> </trunk> </html>                      

Server File Location for File Upload

We demand to store file into some directory at server, nosotros can have this directory hardcoded in program but for improve flexibility, we volition keep information technology configurable in deployment descriptor context params. Also we will add our upload file html page to the welcome file list.

Our web.xml file will expect like below:

                          <?xml version="1.0" encoding="UTF-eight"?> <web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://coffee.sun.com/xml/ns/javaee" xsi:schemaLocation="https://coffee.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">   <brandish-name>ServletFileUploadDownloadExample</brandish-proper name>   <welcome-file-list>     <welcome-file>index.html</welcome-file>   </welcome-file-list>   <context-param>     <param-proper name>tempfile.dir</param-name>     <param-value>tmpfiles</param-value>   </context-param> </web-app>                      

ServletContextListener for File Upload Location

Since we need to read context parameter for file location and create a File object from it, we can write a ServletContextListener to practice it when context is initialized. We tin set accented directory location and File object as context aspect to exist used by other servlets.

Our ServletContextListener implementation code is like below.

                          parcel com.journaldev.servlet;  import coffee.io.File;  import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener;  @WebListener public class FileLocationContextListener implements ServletContextListener {      public void contextInitialized(ServletContextEvent servletContextEvent) {     	Cord rootPath = System.getProperty("catalina.home");     	ServletContext ctx = servletContextEvent.getServletContext();     	Cord relativePath = ctx.getInitParameter("tempfile.dir");     	File file = new File(rootPath + File.separator + relativePath);     	if(!file.exists()) file.mkdirs();     	Organisation.out.println("File Directory created to be used for storing files");     	ctx.setAttribute("FILES_DIR_FILE", file);     	ctx.setAttribute("FILES_DIR", rootPath + File.separator + relativePath);     }  	public void contextDestroyed(ServletContextEvent servletContextEvent) { 		//do cleanup if needed 	} 	 }                      

File Upload Download Servlet

Update: Servlet Specs 3 added support to upload files on server in the API, then we won't need to use any third political party API. Please check out Servlet 3 Upload File.

For File upload, we volition use Apache Eatables FileUpload utility, for our project we are using version i.iii, FileUpload depends on Apache Commons IO jar, and so we need to place both in the lib directory of the project, equally you can come across that in above image for projection structure.

Nosotros volition use DiskFileItemFactory mill that provides a method to parse the HttpServletRequest object and return list of FileItem. FileItem provides useful method to get the file name, field proper name in form, size and content type details of the file that needs to be uploaded. To write file to a directory, all nosotros need to exercise it create a File object and pass it every bit argument to FileItem write() method.

Since the whole purpose of the servlet is to upload file, we will override init() method to initialise the DiskFileItemFactory object instance of the servlet. We volition use this object in the doPost() method implementation to upload file to server directory.

In one case the file gets uploaded successfully, nosotros will ship response to client with URL to download the file, since HTML links use Go method,we will append the parameter for file name in the URL and we can utilize the aforementioned servlet doGet() method to implement file download process.

For implementing download file servlet, showtime nosotros volition open up the InputStream for the file and utilize ServletContext.getMimeType() method to become the MIME blazon of the file and prepare it every bit response content type.

Nosotros will also need to set the response content length as length of the file. To make certain that client understand that we are sending file in response, we need to set "Content-Disposition" header with value as "attachment; filename="fileName".

In one case nosotros are done with setting response configuration, we can read file content from InputStream and write it to ServletOutputStream and the flush the output to client.

Our final implementation of UploadDownloadFileServlet servlet looks similar below.

                          package com.journaldev.servlet;  import coffee.io.File; import coffee.io.FileInputStream; import coffee.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.Iterator; import coffee.util.List;  import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;  import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.eatables.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload;  @WebServlet("/UploadDownloadFileServlet") public form UploadDownloadFileServlet extends HttpServlet { 	private static final long serialVersionUID = 1L;     private ServletFileUpload uploader = null; 	@Override 	public void init() throws ServletException{ 		DiskFileItemFactory fileFactory = new DiskFileItemFactory(); 		File filesDir = (File) getServletContext().getAttribute("FILES_DIR_FILE"); 		fileFactory.setRepository(filesDir); 		this.uploader = new ServletFileUpload(fileFactory); 	} 	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 		Cord fileName = asking.getParameter("fileName"); 		if(fileName == null || fileName.equals("")){ 			throw new ServletException("File Proper name can't be nothing or empty"); 		} 		File file = new File(request.getServletContext().getAttribute("FILES_DIR")+File.separator+fileName); 		if(!file.exists()){ 			throw new ServletException("File doesn't exists on server."); 		} 		System.out.println("File location on server::"+file.getAbsolutePath()); 		ServletContext ctx = getServletContext(); 		InputStream fis = new FileInputStream(file); 		String mimeType = ctx.getMimeType(file.getAbsolutePath()); 		response.setContentType(mimeType != null? mimeType:"application/octet-stream"); 		response.setContentLength((int) file.length()); 		response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 		 		ServletOutputStream os = response.getOutputStream(); 		byte[] bufferData = new byte[1024]; 		int read=0; 		while((read = fis.read(bufferData))!= -one){ 			os.write(bufferData, 0, read); 		} 		os.affluent(); 		os.close(); 		fis.close(); 		System.out.println("File downloaded at customer successfully"); 	}  	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 		if(!ServletFileUpload.isMultipartContent(asking)){ 			throw new ServletException("Content blazon is non multipart/grade-data"); 		} 		 		response.setContentType("text/html"); 		PrintWriter out = response.getWriter(); 		out.write("<html><head></head><body>"); 		try { 			List<FileItem> fileItemsList = uploader.parseRequest(request); 			Iterator<FileItem> fileItemsIterator = fileItemsList.iterator(); 			while(fileItemsIterator.hasNext()){ 				FileItem fileItem = fileItemsIterator.next(); 				System.out.println("FieldName="+fileItem.getFieldName()); 				System.out.println("FileName="+fileItem.getName()); 				System.out.println("ContentType="+fileItem.getContentType()); 				System.out.println("Size in bytes="+fileItem.getSize()); 				 				File file = new File(asking.getServletContext().getAttribute("FILES_DIR")+File.separator+fileItem.getName()); 				Arrangement.out.println("Accented Path at server="+file.getAbsolutePath()); 				fileItem.write(file); 				out.write("File "+fileItem.getName()+ " uploaded successfully."); 				out.write("<br>"); 				out.write("<a href=\"UploadDownloadFileServlet?fileName="+fileItem.getName()+"\">Download "+fileItem.getName()+"</a>"); 			} 		} grab (FileUploadException e) { 			out.write("Exception in uploading file."); 		} catch (Exception due east) { 			out.write("Exception in uploading file."); 		} 		out.write("</trunk></html>"); 	}  }                      

The sample execution of the project is shown in below images.

Servlet File Upload HTML JSP Form

Servlet File Upload to Server

Servlet Download File

Download Servlet File Upload Download Project

You tin download Apache Commons IO jar and Apache Commons FileUpload jar from below URLs.

https://commons.apache.org/proper/eatables-fileupload/download_fileupload.cgi
https://commons.apache.org/proper/eatables-io/download_io.cgi

Check out adjacent article in the series about Servlet Exception Handling.

harveyprostand1958.blogspot.com

Source: https://www.journaldev.com/1964/servlet-upload-file-download-example

0 Response to "How to Download and Fill Out Form and Upload Again"

إرسال تعليق

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel