问题描述
由于tomcat10和jdk17 的包名都改成了Jakarta,而maven上的Apache Commons FileUpload 的最新1.5版本的servlet还是javax的包下的,这就使得和tomcat10产生冲突。
经过我半小时的查询,终于在FileUpload的官网上找到了基于Jakarta包的 FileUpload的maven依赖
附上全部代码:
网页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<base href="<%=(request.getContextPath())+"/"%>">
</head>
<body>
<form action="fileUpload" method="post" enctype="multipart/form-data">
请选择照片:<input type="file" name="picName"><br>
请重新命名图片:<input type="text" name="pic"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
获取日期工具类
package com.servlet.Utils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class WebUtil {
public static String getDate(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy/MM/dd");
Date date = new Date();
String format = simpleDateFormat.format(date);
return format;
}
}
后端处理文件servlet
package com.servlet;
import com.servlet.Utils.WebUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload2.core.DiskFileItemFactory;
import org.apache.commons.fileupload2.core.FileItem;
import org.apache.commons.fileupload2.jakarta.servlet5.JakartaServletFileUpload;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
public class FileUploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
DiskFileItemFactory作用;
DiskFileItemFactory负责创建FileItem对象,并决定这些对象在内存中缓存的大小和临时文件存储的路径。
这个类通常与ServletFileUpload类一起使用,
ServletFileUpload类会使用DiskFileItemFactory来创建FileItem对象。
*/
DiskFileItemFactory.Builder builder = new DiskFileItemFactory.Builder();
DiskFileItemFactory diskFileItemFactory = builder.get();
/*
ServletFileUpload作用:
ServletFileUpload是Apache Commons FileUpload库中的一个类,用于处理文件上传请求。
它能够解析HTTP请求中的multipart/form-data数据,提取出上传的文件及其他相关信息。
这个类可以处理多个文件上传请求,并且提供了一些便捷的方法来访问上传的文件内容和相关信息。
ServletFileUpload类负责解析上传的文件,将文件内容保存到磁盘或者内存中,并提供给开发者访问。
*/
JakartaServletFileUpload fileUpload = new JakartaServletFileUpload(diskFileItemFactory);
// 判断是不是multipart/form-data数据
if (JakartaServletFileUpload.isMultipartContent(request)){
//解析出request中的数据,自动放入到list中
List list = fileUpload.parseRequest(request);
for (Object obj : list) {
FileItem fileItem = (FileItem) obj;
// 判断是不是表单文本数据,取反就是文件数据
if (!fileItem.isFormField()){
// 创建目录 用来存放传递来的文件
// 根据获取到的时间创建多级目录
// WebUtil.getDate() ---> 24/04/15
String uploadPath = request.getServletContext().getRealPath("/upload") +"/"+ WebUtil.getDate() +"/";
System.out.println(uploadPath);
File uploadPathDir = new File(uploadPath);
if (!uploadPathDir.exists()){
uploadPathDir.mkdirs();
}
// 避免文件重名
String fileDiskPath = uploadPath+ UUID.randomUUID()+"_" +fileItem.getName();
File uploadFileDisk = new File(fileDiskPath);
//将网络文件写入磁盘
fileItem.write(uploadFileDisk.toPath());
}
}
}
}
}
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.east</groupId>
<artifactId>documentDownload</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>documentDownload Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-fileupload2-jakarta-servlet5</artifactId>
<version>2.0.0-M2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
</dependencies>
<build>
<finalName>documentDownload</finalName>
</build>
</project>