Servlet 支持通过HTTP上传文件,常用于处理用户提交的图片、文档等。本文将介绍如何在Servlet中实现文件上传功能,使用 multipart/form-data 表单和Servlet 3.0+的内置支持。


目录

  1. 文件上传概述
  2. 环境准备
  3. 处理文件上传
  4. 保存上传文件
  5. 完整示例
  6. 部署与测试
  7. 参考资料

1. 文件上传概述

  • 定义:客户端通过表单上传文件到服务器,Servlet 处理并存储。
  • 表单要求:使用 multipart/form-data 编码。
  • Servlet 3.0+:通过 @MultipartConfigPart 接口简化文件上传。

2. 环境准备

  • 工具:Tomcat 7+(支持Servlet 3.0)。
  • 依赖:无需额外库,Servlet API内置支持。
  • 目录:准备服务器端存储文件的目录(如 /uploads)。

3. 处理文件上传

配置Servlet

使用 @MultipartConfig 注解:

  • location:文件临时存储路径。
  • maxFileSize:最大文件大小(字节)。
  • maxRequestSize:最大请求大小。

获取文件

通过 HttpServletRequest.getPart() 获取上传文件:

Part filePart = request.getPart("file"); // "file" 是表单字段名

4. 保存上传文件

获取文件名

Content-Disposition 头提取:

String fileName = filePart.getSubmittedFileName();

保存文件

使用 write() 方法:

String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads";
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();
filePart.write(uploadPath + File.separator + fileName);

5. 完整示例

以下是一个实现文件上传的Servlet。

HTML:upload.html

<!DOCTYPE html>
<html>
<head><title>文件上传</title></head>
<body>
    <h2>上传文件</h2>
    <form method="POST" action="/myapp/upload" enctype="multipart/form-data">
        文件: <input type="file" name="file"><br>
        描述: <input type="text" name="description"><br>
        <input type="submit" value="上传">
    </form>
</body>
</html>

Servlet:UploadServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@MultipartConfig(
    location = "/tmp",           // 临时存储路径
    maxFileSize = 1024 * 1024 * 5, // 5MB
    maxRequestSize = 1024 * 1024 * 10 // 10MB
)
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        try {
            // 获取表单数据
            String description = request.getParameter("description");
            Part filePart = request.getPart("file");
            String fileName = filePart.getSubmittedFileName();

            // 保存文件
            String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads";
            File uploadDir = new File(uploadPath);
            if (!uploadDir.exists()) uploadDir.mkdir();
            String filePath = uploadPath + File.separator + fileName;
            filePart.write(filePath);

            out.println("<html><body>");
            out.println("<h1>文件上传成功</h1>");
            out.println("<p>文件名: " + fileName + "</p>");
            out.println("<p>描述: " + (description != null ? description : "无") + "</p>");
            out.println("<p>保存路径: " + filePath + "</p>");
            out.println("<a href=\"/myapp/upload.html\">返回</a>");
            out.println("</body></html>");
        } catch (Exception e) {
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "上传失败: " + e.getMessage());
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.sendRedirect("/myapp/upload.html");
    }
}

配置:web.xml(可选)

如果不使用注解:

<web-app>
    <servlet>
        <servlet-name>UploadServlet</servlet-name>
        <servlet-class>UploadServlet</servlet-class>
        <multipart-config>
            <location>/tmp</location>
            <max-file-size>5242880</max-file-size> <!-- 5MB -->
            <max-request-size>10485760</max-request-size> <!-- 10MB -->
        </multipart-config>
    </servlet>
    <servlet-mapping>
        <servlet-name>UploadServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>
</web-app>

6. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar UploadServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. upload.html 放入 myapp/
  3. 确保 /tmp 目录可写,或修改 location 为可写路径。
  4. 部署 myapp 到Tomcat的 webapps 目录。
  5. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/upload.html
  • 选择文件并输入描述,提交:
    • 成功:显示文件信息。
    • 失败(如文件过大):显示错误。
  • 检查 myapp/uploads/ 目录,确认文件已保存。

7. 参考资料

出站链接

其他资源

  • 《Servlet & JSP: A Tutorial》 – 文件上传章节。
  • X社区:搜索 #ServletFileUpload 获取示例。

这篇指南展示了Servlet文件上传的实现。如果需要更复杂功能(如多文件上传、进度条或云存储集成),请告诉我!