目录
文件上传的工作原理
在 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());
}
%>
参考资料
- Oracle 官方文档
- Servlet 3.0 File Upload
- 出站链接:https://docs.oracle.com/javaee/7/api/javax/servlet/http/Part.html
- 提供 Servlet 文件上传的官方说明。
- Apache Commons FileUpload
- Commons FileUpload User Guide
- 出站链接:https://commons.apache.org/proper/commons-fileupload/using.html
- 详细讲解 Commons FileUpload 的使用。
- JavaTpoint JSP 教程
- JSP File Upload
- 出站链接:https://www.javatpoint.com/jsp-file-upload
- 提供 JSP 文件上传的示例。
如果需要更复杂的文件上传功能(如多文件上传或限制文件类型),请告诉我!
发表回复