目录

  1. 文件上传的工作原理
  2. 实现文件上传的步骤
  1. 示例代码
  2. 参考资料

文件上传的工作原理

在 JSP 中,文件上传通过 HTML 表单(设置 enctype="multipart/form-data")提交文件数据,服务器端使用第三方库(如 Apache Commons FileUpload)或 Servlet 3.0+ 的内置支持(@MultipartConfig)解析 multipart 请求,将文件保存到指定路径。


实现文件上传的步骤

2.1 添加必要的依赖

  • 使用 Commons FileUpload(传统方式):
    在项目中添加以下 Maven 依赖:
  <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.5</version>
  </dependency>
  <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.15.1</version>
  </dependency>
  • 使用 Servlet 3.0+:无需额外依赖,直接使用 request.getPart()

2.2 创建上传表单

  • 要求:表单需使用 POST 方法,且 enctype="multipart/form-data"
  • 示例(upload.html):
  <form action="upload.jsp" method="post" enctype="multipart/form-data">
      文件: <input type="file" name="file"><br>
      <input type="submit" value="上传">
  </form>

2.3 处理上传的 JSP 或 Servlet

  • 使用 Commons FileUpload
  <%@ page contentType="text/html;charset=UTF-8" %>
  <%@ page import="org.apache.commons.fileupload.*" %>
  <%@ page import="org.apache.commons.fileupload.disk.*" %>
  <%@ page import="org.apache.commons.fileupload.servlet.*" %>
  <%@ page import="java.io.*" %>
  <%@ page import="java.util.*" %>
  <%
      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();
                  File uploadedFile = new File("C:/uploads/" + fileName);
                  item.write(uploadedFile);
                  out.println("文件 " + fileName + " 上传成功!");
              }
          }
      } catch (Exception e) {
          out.println("上传失败: " + e.getMessage());
      }
  %>
  • 使用 Servlet 3.0+(推荐):
  <%@ page contentType="text/html;charset=UTF-8" %>
  <%@ page import="javax.servlet.http.Part" %>
  <%
      Part filePart = request.getPart("file"); // 获取文件
      String fileName = filePart.getSubmittedFileName();
      filePart.write("C:/uploads/" + fileName); // 保存文件
      out.println("文件 " + fileName + " 上传成功!");
  %>
  • 注意:需要在 Servlet 上添加 @MultipartConfig 注解,或在 web.xml 中配置 multipart 支持:
    xml <servlet> <servlet-name>UploadServlet</servlet-name> <jsp-file>/upload.jsp</jsp-file> <multipart-config> <location>C:/uploads</location> <max-file-size>10485760</max-file-size> <!-- 10MB --> </multipart-config> </servlet>

示例代码

  • 上传表单(upload.html):
  <form action="upload.jsp" method="post" enctype="multipart/form-data">
      选择文件: <input type="file" name="file"><br>
      <input type="submit" value="上传">
  </form>
  • 处理上传(upload.jsp,使用 Servlet 3.0+):
  <%@ page contentType="text/html;charset=UTF-8" %>
  <%
      try {
          Part filePart = request.getPart("file");
          String fileName = filePart.getSubmittedFileName();
          String uploadPath = "C:/uploads/" + fileName;
          filePart.write(uploadPath);
          out.println("文件 " + fileName + " 上传成功!");
      } catch (Exception e) {
          out.println("上传失败: " + e.getMessage());
      }
  %>

参考资料

  1. Oracle 官方文档
  1. Apache Commons FileUpload
  1. JavaTpoint JSP 教程

如果需要更复杂的文件上传功能(如多文件上传或限制文件类型),请告诉我!