Java文件上传的实现

简介

本篇文章旨在教会刚入行的小白如何实现Java文件上传,并解决可能遇到的问题:“Current request is not a multipart request”。

上传文件流程

以下表格展示了实现文件上传的整个流程。

步骤 描述
1. 创建HTML表单 创建一个HTML表单,用于用户选择要上传的文件
2. 创建Servlet 创建一个Servlet类,用于接收文件上传请求并处理
3. 配置web.xml 配置web.xml文件,将Servlet映射到特定URL路径
4. 处理文件上传 在Servlet中,使用MultipartConfig注解和HttpServletRequest对象来处理文件上传请求
5. 保存文件 将上传的文件保存到服务器的特定目录
6. 返回响应 返回上传成功或失败的响应给客户端

接下来,我们将逐步介绍每个步骤应该做什么,并提供相关的代码示例。

创建HTML表单

首先,我们需要创建一个HTML表单,用于用户选择要上传的文件。在表单中,我们需要使用enctype="multipart/form-data"属性,以便支持文件上传。

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

创建Servlet

接下来,我们需要创建一个Servlet类,用于接收文件上传请求并处理。在Servlet中,我们需要重写doPost()方法来处理POST请求。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UploadServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 处理文件上传
  }

}

配置web.xml

然后,我们需要将Servlet映射到特定的URL路径。在web.xml文件中,我们需要添加以下配置。

<servlet>
  <servlet-name>UploadServlet</servlet-name>
  <servlet-class>com.example.UploadServlet</servlet-class>
  <multipart-config>
    <location>/path/to/save/uploads</location>
    <max-file-size>10000000</max-file-size>
    <max-request-size>10000000</max-request-size>
    <file-size-threshold>0</file-size-threshold>
  </multipart-config>
</servlet>

<servlet-mapping>
  <servlet-name>UploadServlet</servlet-name>
  <url-pattern>/upload</url-pattern>
</servlet-mapping>

在上述配置中,<servlet-class>标签应设置为你创建的Servlet类的完整路径。

处理文件上传

现在,我们来处理文件上传的具体操作。在Servlet的doPost()方法中,我们需要使用request.getPart("file")方法来获取上传的文件。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class UploadServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    Part filePart = request.getPart("file");
    // 处理文件上传
  }

}

保存文件

接下来,我们需要将上传的文件保存到服务器的特定目录。我们可以使用filePart.write()方法将文件写入服务器的文件系统。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class UploadServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    Part filePart = request.getPart("file");
    String fileName = filePart.getSubmittedFileName();
    
    String savePath = "/path/to/save/uploads/" + fileName;
    filePart.write(savePath);
    
    // 返回响应
  }

}

在上述代码中,filePart.getSubmittedFileName()用于获取上传文件的原始文件名,并使用该文件名构建保存路径。

返回响应

最后,我们需要返回上传成功或失败的响应给客户端。在Servlet中,我们可以使用response.getWriter().println()方法来输出响应消息。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class UploadServlet extends