Uploading Files with Servlets and JSP – 用Servlet和JSP上传文件

最后修改: 2018年 5月 19日

1. Introduction


In this quick tutorial, we’ll see how to upload a file from a servlet.


To achieve this, we’ll first see the vanilla Jakarta EE solution with file upload capabilities provided by native @MultipartConfig annotation.

为了实现这一点,我们首先看看香草式的Jakarta EE解决方案,它具有由本地@MultipartConfig注释提供的文件上传功能。

Then, we’ll go over the Apache Commons FileUpload library, for earlier versions of the Servlet API.

然后,我们将介绍Apache Commons FileUpload库,用于Servlet API的早期版本。

2. Using Jakarta EE @MultipartConfig

2.使用Jakarta EE @MultipartConfig

Jakarta EE has the ability to support multi-part uploads out of the box.

Jakarta EE有能力支持开箱即用的多部分上传。

As such, it’s probably a default go-to when enriching a Jakarta EE app with file upload support.

因此,在丰富Jakarta EE应用程序的文件上传支持时,它可能是一个默认的选择。

First, let’s add a form to our HTML file:


<form method="post" action="multiPartServlet" enctype="multipart/form-data">
    Choose a file: <input type="file" name="multiPartServlet" />
    <input type="submit" value="Upload" />

The form should be defined using the enctype=”multipart/form-data” attribute to signal a multipart upload.


Next, we’ll want to annotate our HttpServlet with the correct information using the @MultipartConfig annotation:


@MultipartConfig(fileSizeThreshold = 1024 * 1024,
  maxFileSize = 1024 * 1024 * 5, 
  maxRequestSize = 1024 * 1024 * 5 * 5)
public class MultipartServlet extends HttpServlet {

Then, let’s make sure that our default server upload folder is set:


String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();

Finally, we can easily retrieve our inbound File from the request using the getParts() method, and save it to the disk:

最后,我们可以使用getParts() method轻松地从request 中获取我们的入站文件,并将其保存到磁盘中。

for (Part part : request.getParts()) {
    fileName = getFileName(part);
    part.write(uploadPath + File.separator + fileName);

Note that, in this example, we’re using a helper method getFileName():


private String getFileName(Part part) {
    for (String content : part.getHeader("content-disposition").split(";")) {
        if (content.trim().startsWith("filename"))
            return content.substring(content.indexOf("=") + 2, content.length() - 1);
    return Constants.DEFAULT_FILENAME;

For Servlet 3.1. projects, we could alternatively use the Part.getSubmittedFileName() method:

对于Servlet 3.1.项目,我们可以选择使用Part.getSubmittedFileName()方法:

fileName = part.getSubmittedFileName();

3. Using Apache Commons FileUpload

3.使用Apache Commons FileUpload

If we’re not on a Servlet 3.0 project, we can use the Apache Commons FileUpload library directly.

如果我们不是在Servlet 3.0项目上,我们可以直接使用Apache Commons FileUpload库。

3.1. Setup


We’ll want to use the following pom.xml dependencies to get our example running:



The most recent versions can be found with a quick search on Maven’s Central Repository: commons-fileupload and commons-io.


3.2. Upload Servlet


The three main parts to incorporating Apache’s FileUpload library go as follows:


  • An upload form in a .jsp page.
  • Configuring your DiskFileItemFactory and ServletFileUpload object.
  • Processing the actual contents of a multipart file upload.

The upload form is the same as the one in the previous section.


Let’s move on to creating our Jakarta EE servlet.

让我们继续创建我们的Jakarta EE servlet。

In our request processing method, we can wrap the incoming HttpRequest with a check to see if it’s a multi-part upload.


We’ll also specify what resources to allocate to the file upload temporarily (while being processed) on our DiskFileItemFactory.


Lastly, we’ll create a ServletFileUpload object which will represent the actual file itself. It will expose the contents of the multi-part upload for final persistence server side:


if (ServletFileUpload.isMultipartContent(request)) {

    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

    ServletFileUpload upload = new ServletFileUpload(factory);
    String uploadPath = getServletContext().getRealPath("") 
      + File.separator + UPLOAD_DIRECTORY;
    File uploadDir = new File(uploadPath);
    if (!uploadDir.exists()) {

And, then we can extract those contents and write them to disk:


if (ServletFileUpload.isMultipartContent(request)) {
    List<FileItem> formItems = upload.parseRequest(request);
    if (formItems != null && formItems.size() > 0) {
        for (FileItem item : formItems) {
	    if (!item.isFormField()) {
	        String fileName = new File(item.getName()).getName();
	        String filePath = uploadPath + File.separator + fileName;
                File storeFile = new File(filePath);
                request.setAttribute("message", "File "
                  + fileName + " has uploaded successfully!");

4. Running the Example


After we’ve compiled our project into a .war, we can drop it into our local Tomcat instance and start it up.


From there, we can bring up the main upload view where we’re presented with a form:



After successfully uploading our file, we should see the message:



Lastly, we can check the location specified in our servlet:



5. Conclusion


That’s it! We’ve learned how to provide multi-part file uploads using Jakarta EE, as well as Apache’s Common FileUpload library!

这就是了!我们已经学会了如何使用Jakarta EE以及Apache的通用FileUpload库来提供多部分的文件上传!

Code snippets, as always, can be found over on GitHub.