Servlet上传文件
这是一个Maven项目
tomcat版本:9.0.107
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.example</groupId><artifactId>FuncExt</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>FuncExt 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><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.20.0</version></dependency><!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.6.0</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency></dependencies><build><finalName>FuncExt</finalName></build>
</project>
Servlet.java
package Servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;public class Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//判断上传的文件是普通表单还是带文件的表单if(!ServletFileUpload.isMultipartContent(req)){System.out.println("普通表单");return;}//创建上传文件的保存路径,在WEB-INF路径下,安全,用户无法直接访问String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");File uploadFile = new File(uploadPath);if(!uploadFile.exists()){uploadFile.mkdir();//创建临时目录}//缓存,临时文件//临时路径String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");File tmpFile = new File(tmpPath);if(!tmpFile.exists()){tmpFile.mkdir();}try{//创建DiskFileItemFactory对象,处理文件上传路径或者大小限制DiskFileItemFactory factory = getDiskFileItemFactory(tmpFile);//获取ServletFileUploadServletFileUpload upload = getServletFileUpload(factory);//处理上传的文件String msg = uploadParseRequest(upload,req,uploadPath);//servlet请求转发消息req.setAttribute("msg",msg);req.getRequestDispatcher("info.jsp").forward(req,resp);} catch (Exception e){e.printStackTrace();}System.out.println("文件保存路径:" + uploadPath);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}public static DiskFileItemFactory getDiskFileItemFactory(File file){DiskFileItemFactory factory = new DiskFileItemFactory();//通过这个工厂设置一个缓冲区,上传的文件大于这个缓冲区的话,将它放到临时文件里factory.setSizeThreshold(1024 * 1024);// 1Mfactory.setRepository(file); //临时文件的保存目录return factory;}public static ServletFileUpload getServletFileUpload(DiskFileItemFactory diskFileItemFactory){ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);//监听文件上传进度upload.setProgressListener(new ProgressListener() {@Overridepublic void update(long l, long l1, int i) {System.out.println("总大小:" + l1 + "已上传:" + l);}});upload.setHeaderEncoding("UTF-8");upload.setFileSizeMax(1024 * 1024 * 10);upload.setSizeMax(1024 * 1024 * 10);return upload;}public static String uploadParseRequest(ServletFileUpload upload,HttpServletRequest request,String uploadPath) throws Exception{String msg = "";//把前端请求解析,分成一个一个文件List<FileItem> fileItems = upload.parseRequest(request);for(FileItem fileItem : fileItems){if(fileItem.isFormField()){String name = fileItem.getFieldName();String value = fileItem.getString("UTF-8");System.out.println(name + ":" + value);}else {String uploadFileName = fileItem.getName();System.out.println("上传的文件名:" + uploadFileName);if(uploadFileName == null || uploadFileName.trim().equals("")){continue;}String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);String fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);System.out.println("文件信息【件名:" + fileName + "---文件类型" + fileExtName + "】");String uuidPath = UUID.randomUUID().toString();String realPath = uploadPath + "/" + uuidPath;//给每个文件创建一个对应的文件夹;File realPathFile = new File(realPath);if(!realPathFile.exists()){realPathFile.mkdir();}InputStream inputStream = fileItem.getInputStream();FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);byte[] b = new byte[1024 * 1024];int len = 0;while((len = inputStream.read(b)) != -1){fileOutputStream.write(b,0,len);}fileOutputStream.close();inputStream.close();msg = "文件上传成功!";fileItem.delete();}}return msg;}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"metadata-complete="true"><servlet><servlet-name>file</servlet-name><servlet-class>Servlet.Servlet</servlet-class></servlet><servlet-mapping><servlet-name>file</servlet-name><url-pattern>/upload</url-pattern></servlet-mapping>
</web-app>
index.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body><form action = "${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">上传用户: <input type="text" name="username"> <br/><p><input type="file" name = "file1"></p><p><input type="file" name = "file2"></p><p> <input type = "submit"> | <input type="reset"> </p></form>
</body>
</html>
info.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>${msg}</body>
</html>