Servlet 支持通过HTTP上传文件,常用于处理用户提交的图片、文档等。本文将介绍如何在Servlet中实现文件上传功能,使用 multipart/form-data
表单和Servlet 3.0+的内置支持。
目录
1. 文件上传概述
- 定义:客户端通过表单上传文件到服务器,Servlet 处理并存储。
- 表单要求:使用
multipart/form-data
编码。 - Servlet 3.0+:通过
@MultipartConfig
和Part
接口简化文件上传。
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. 部署与测试
部署
- 编译:
javac -cp /path/to/tomcat/lib/servlet-api.jar UploadServlet.java
- 将
.class
文件放入myapp/WEB-INF/classes/
。 - 将
upload.html
放入myapp/
。 - 确保
/tmp
目录可写,或修改location
为可写路径。 - 部署
myapp
到Tomcat的webapps
目录。 - 启动Tomcat。
测试
- 访问:
http://localhost:8080/myapp/upload.html
- 选择文件并输入描述,提交:
- 成功:显示文件信息。
- 失败(如文件过大):显示错误。
- 检查
myapp/uploads/
目录,确认文件已保存。
7. 参考资料
出站链接
- Servlet Part API – 官方API。
- Java EE教程 – 文件上传章节。
- Tomcat文档 – Multipart支持。
其他资源
- 《Servlet & JSP: A Tutorial》 – 文件上传章节。
- X社区:搜索 #ServletFileUpload 获取示例。
这篇指南展示了Servlet文件上传的实现。如果需要更复杂功能(如多文件上传、进度条或云存储集成),请告诉我!
发表回复