This example using the Apache Commons FileUpload
library to create a simple application for uploading files. The program is divided into two parts, a form using JSP and a servlet for handling the upload process. To run the sample you need to download the Commons FileUpload and Commons IO get the latest stable version.
The first step is to create the upload form. The form contains two fields for selecting file to be uploaded and a submit button. The form should have an enctype
attribute and the value is multipart/form-data
. We use a post method and the submit process is handled by the upload-servlet
as defined in the action
attribute.
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
<title>File Upload</title>
</head>
<body>
<h1>File Upload Form</h1>
<hr/>
<form action="${pageContext.request.contextPath}/upload-servlet"
method="post" enctype="multipart/form-data">
<fieldset>
<legend>Upload File</legend>
<label for="filename_1">File: </label>
<input id="filename_1" type="file" name="filename_1" size="50"/><br/>
<label for="filename_2">File: </label>
<input id="filename_2" type="file" name="filename_2" size="50"/><br/>
<br/>
<input type="submit" value="Upload File"/>
</fieldset>
</form>
</body>
</html>
The second step is to create the servlet. The doPost
method checks to see if the request contains a multipart content. After that we create a FileItemFactory
, in this example we use the DiskFileItemFactory
which is the default factory for FileItem
. This factory creates an instance of FileItem
and stored it either in memory or in a temporary file on disk depending on its content size.
The ServletFileUpload
handles multiple files upload that we’ve specified in the form above sent using the multipart/form-data
encoding type. The process of storing the data is determined by the FileItemFactory
passed to the ServletFileUpload
class.
The next steps is to parse the multipart/form-data
stream by calling the ServletFileUpload.parseRequest(HttpServletRequest request)
method. The parse process return a list of FileItem
. After that we iterate on the list and check to see if FileItem
representing an uploaded file or a simple form field. If it is represents an uploaded file we write the FileItem
content to a file.
So here is the FileUploadDemoServlet
.
package org.kodejava.commons.fileupload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.Serial;
import java.util.List;
@WebServlet(urlPatterns = "/upload-servlet")
public class FileUploadDemoServlet extends HttpServlet {
@Serial
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = item.getName();
String root = getServletContext().getRealPath("/");
File path = new File(root + "/uploads");
if (!path.exists()) {
boolean status = path.mkdirs();
}
File uploadedFile = new File(path + "/" + fileName);
System.out.println(uploadedFile.getAbsolutePath());
item.write(uploadedFile);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Maven Dependencies
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
</dependencies>
- How do I get number of each day for a certain month in Java? - September 8, 2024
- How do I get operating system process information using ProcessHandle? - July 22, 2024
- How do I sum a BigDecimal property of a list of objects using Java Stream API? - July 22, 2024