目录
这回我们需要讨论的是使用Maven的普通servlet项目的文件上传的相关方法。
1.创建普通MavenWeb项目
创建新项目:

左边选则创建Maven项目,右边勾选Creat from archetype选则webapp选项:

填写组id:

Finish:

2.引入servlet相关的依赖
我们需要引入的依赖有两类:一个是与servlet相关的依赖,另一个是与文件上传相关的依赖。
XML
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>servlet-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- Servlet 核心依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--引入两个与文件上传相关的依赖包-->
<!-- 文件上传核心依赖 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- IO 工具包 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
</project>
3.相关准备工作
(1)首先创建如下目录结构作为本次实验结构:

(2)在index.jsp文件中写入前端的初始化代码:
html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
</body>
</html>
(3)创建FileSubmitServlet文件并继承HttpServlet类(鼠标放在类名上面,点击Ctrl+o并勾选doPost和doGet方法):

java
package com.newFile.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FileSubmitServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
(4)初始化web.xml文件:
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="3.1">
</web-app>
(5)编写servlet映射路径(编写完映射路径后,前端就可以经参数传递给对应的路径了):
XML
<servlet>
<servlet-name>FileSubmitServlet1</servlet-name>
<servlet-class>com.newFile.servlet.FileSubmitServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileSubmitServlet1</servlet-name>
<url-pattern>/FileSubmit</url-pattern>
</servlet-mapping>
4.前端传递文件类型参数
前端可以使用form表单形式将文件类型传递给后端,其中form标签中务必添加一个属性:enctype="multipart/form-data"表示将文件以二进制流的形式传递给后端。
这里第一个input类型标为file类型,第二个提交按键类型标为submit类型。
action中填写需要向后端传递的url。
html
<form action="/inputFile" method="post" enctype="multipart/form-data">
<input type="file" name="inputFile" value="选则文件">
<br><br>
<input type="submit" value="提交文件">
</form>
5.后端代码
我们测试就先使用doPost方法:
(1)后端首先创建创建文件保存的位置(假设我想将上传的文件保存在D:\study4\Test510中),并且我如果没有创建这个保存文件的文件夹,我需要创建一下。
java
String savePath = "D:\\study4\\Test510";
File file = new File(savePath);
if(!file.exists()){
//如果路径不存在就创建新路径
file.mkdirs();
}
这里的File file = new File(savaPath);只是绑定对应文件的位置,不是创建文件。
(2)有了保存文件的位置后,我们还需要创建一个文件上传解析器,后续就可以通过upload来获取前端传来的文件信息列表:
java
// 2. 创建文件上传解析器
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
前提:fileItem类是前端传过来的一个数据项,不仅仅可以表示文件,也可以表示基本类型的数据,我们可以通过fileItem类来接收前端传递的文件流信息我们可以使用.isFormField()方法判断内容是否为文件格式内容,返回true表示是文件格式的内容,false表示不是文件格式的内容。
(3)利用upload.parseRequest(req);方法类接收前端传递的文件流信息列表,并使用for循环遍历列表并打印文件信息(这里打印的是文章名+文章大小)
java
List<FileItem>items = upload.parseRequest(req);
for(FileItem fi:items){
System.out.println(fi.getName()+":"+fi.getSize());
System.out.println("success");
}
点击运行后选则文件,然后点击提交文件返回控制台。

控制台输出结果:

6.将文件保存在指定的目录下
使用File类的相关构造方法在新的文件夹下创建新的文件,务必使用substring获取文件全名(某些旧版本浏览器使用getName方法不能直接返回类名)。这里使用的是第二种构造方法,通过父级目录创建子级文件。FileItem提供了一个write方法便于将文件写入到指定的File类中,底层用的也是流的形式(也可以使用字节/字符流替换这一操作,不难)。
java
List<FileItem>items = upload.parseRequest(req);
for(FileItem fi:items){
String fileName = fi.getName();
if(fileName.contains("\\")){
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
}
File fileC = new File(file,fileName);
//意思就是将fi写入到新创建好的文件中去
fi.write(fileC);
System.out.println("success");
}
最后运行项目就可以验证结果了