The following text is code example of a sample Java web application that demonstrates how to implement file upload functionality based on Apache Common FileUpload API, servlet and JSP.

The application consists of the following source files:

    • upload.jsp: A JSP page that displays an upload form.
    • A Java servlet that handles file upload.
    • message.jsp: A JSP page that displays message to user after the file is uploaded.
    • web.xml: defines and configures URL mapping for the servlet.

Java runtime configuration:

    • Servlet 2.5+
    • JRE 1.5+

Eclipse project structure: FileUploadServletExample project structure


1. Upload form (upload.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>File Upload Demo</title>
		<form method="post" action="uploadFile" enctype="multipart/form-data">
			Select file to upload: 
			<input type="file" name="uploadFile" /> 
			<input type="submit" value="Upload" />


2. Upload handler class (

package net.codejava.upload;

import java.util.List;

import javax.servlet.ServletException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

 * A Java servlet that handles file upload from client.
 * @author
public class FileUploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	// location to store file uploaded
	private static final String UPLOAD_DIRECTORY = "upload";

	// upload settings
	private static final int MEMORY_THRESHOLD 	= 1024 * 1024 * 3; 	// 3MB
	private static final int MAX_FILE_SIZE 		= 1024 * 1024 * 40; // 40MB
	private static final int MAX_REQUEST_SIZE	= 1024 * 1024 * 50; // 50MB

	 * Upon receiving file upload submission, parses the request to read
	 * upload data and saves the file on disk.
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// checks if the request actually contains upload file
		if (!ServletFileUpload.isMultipartContent(request)) {
			// if not, we stop here
			PrintWriter writer = response.getWriter();
			writer.println("Error: Form must has enctype=multipart/form-data.");

		// configures upload settings
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// sets memory threshold - beyond which files are stored in disk 
		// sets temporary location to store files
		factory.setRepository(new File(System.getProperty("")));

		ServletFileUpload upload = new ServletFileUpload(factory);
		// sets maximum size of upload file
		// sets maximum size of request (include file + form data)

		// constructs the directory path to store upload file
		// this path is relative to application's directory
		String uploadPath = getServletContext().getRealPath("")
				+ File.separator + UPLOAD_DIRECTORY;
		// creates the directory if it does not exist
		File uploadDir = new File(uploadPath);
		if (!uploadDir.exists()) {

		try {
			// parses the request's content to extract file data
			List<FileItem> formItems = upload.parseRequest(request);

			if (formItems != null && formItems.size() > 0) {
				// iterates over form's fields
				for (FileItem item : formItems) {
					// processes only fields that are not form fields
					if (!item.isFormField()) {
						String fileName = new File(item.getName()).getName();
						String filePath = uploadPath + File.separator + fileName;
						File storeFile = new File(filePath);

						// saves the file on disk
							"Upload has been done successfully!");
		} catch (Exception ex) {
					"There was an error: " + ex.getMessage());
		// redirects client to message page
				request, response);

3. Message page (message.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Upload Result</title>



4. Web deployment descriptor (web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="" 
	id="WebApp_ID" version="2.5">


5. Required libraries

Download distribution and extract zip archive, then pick up jar file of the following libraries:

6. Testing the application

URL: http://localhost:8080/FileUploadServletExample

Pick a file to upload:

Test file upload servlet - upload form


Test file upload servlet - upload result


As shown in the above code example, the sample application stores uploaded file in a directory named “upload”, which is relative to the web application’s directory and will be created if not exist. However, saving files into a location relative to the application’s directory is not recommended, because the directory can be deleted when the application is redeployed, making the previous uploaded files lost. So it’s recommended to store your files in another location which is independent of the application’s directory.

Recommended further readings:





Recommended Book: Head First Servlets and JSP [Kindle version]

Download this file (FileUploadServletExample.war)FileUploadServletExample.war[Deployable WAR file]209 kB
Download this file ([Eclipse project (jar files included)]217 kB