简单介绍:
首先获取文件上传需要的jar包,在官网中找到:Apache Commons FileUpload 和 Apache Commons IO两个jar包下载后,解压,得到两个jar包,并复制到web下面的lib目录中:
经过一段时间的学习,光外部依赖包就已经这么多了。如果使用的maven,可以之前去官网复制坐标到pom.xml文件中即可。
上传文件需要用到的API:
ServletFileUpload:文件上传的核心类,主要作用是判断上传的文件是否为multipart/form-data,并且将文件分段解析成单个的FileItem,方便对分段文件的操作。
FileItemFactory:将每一个单独的项目封装成DiskFileItem (FileItem接口的实现) 对象的任务,这是一个接口,在使用的时候需要使用具体的实现类,即DiskFileItemFactory。
实现文件上传的过程也非常简单,只需要:
1.下载并导入jar包
2.使用ServletFileUpload的isMultipartContent方法并传入请求对象的方式判断这个请求是否为文件上传的请求
3.创建工厂类对象,用于将每一个项目封装成单独的DiskFileItemFactory也就是FileItemFactory的具体实现类
4.创建文件上传的核心类,ServletFileUpload对象,将工厂类对象作为参数进行传递
5.通过核心类的parseRequest方法,传入一个请求对象为参数,获取到FileItem的集合,在真正进行文件的操作的时候,是使用FileItem对象进行操作
6.遍历FileItem集合,判断是普通的表单数据还是上传的文件,对于普通的表单数据,我们关注的是表单项的属性值和属性值对应的具体的值,对于上传的文件,我们关注的是属性值和文件名,并在获取到信息之后,将文件写入到输入,使用FileItem对象的write方法,参数为一个File对象,最好在构建File对象的时候将文件名添加进去
7.最后抛出异常,关闭流
上传文件使用到的方法和类:
类 | 方法 | 简单描述 |
ServletFileUpload | isMultipartContext | 判断这个请求是否为上传文件的请求,传入一个请求对象作为参数 |
parseRequest | 将文件解析为单个的FileItem对象,传入一个请求对象 | |
FileItem | ifFormField | 判断表单请求中是文件或普通的表单数据,如果是普通的表单数据返回true,如果是文件返回false |
getFieldName | 获取表单中的属性名 | |
getName | 获取文件名 | |
getString | 获取表单中的属性的值 | |
write | 将传入文件写入到磁盘 | |
DiskFileItemFactory | 工厂类的具体实现类,作为参数传递给上传文件的核心类 |
简单案例:将表单中传入的文件写入到E盘下的photo文件夹中
Servlet类中的内容:
package work;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import javax.xml.ws.WebFault;
import javax.xml.ws.WebServiceClient;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Random;
@WebServlet(name = "ServletEL" , value = "/ServletEL")
public class ServletEL extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
/**
* 处理文件上传
* @param req 请求对象
* @param resp 响应对象
* @throws ServletException Servlet异常
* @throws IOException IO异常
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("文件上传成功!");
// ServletInputStream inputStream = req.getInputStream();
// byte[] bytes = new byte[1024];
// int read = inputStream.read(bytes);
// System.out.println(new String(bytes,0,read));
/**
*文件上传的步骤:
* 1.首先导入需要的jar包
* 2.判断上传的文件是否为多段的,只有多段的文件才是上传的
*
*/
// 判断是否为上传的数据
if(ServletFileUpload.isMultipartContent(req)){
// 创建工厂实现类
FileItemFactory fif = new DiskFileItemFactory();
// 创建用于解析上传数据的工具类
ServletFileUpload sfu = new ServletFileUpload(fif);
// 解析数据,获取每一个分段数据的内容
try {
List<FileItem> items = sfu.parseRequest(req);
for(FileItem f : items){
if(f.isFormField()){
System.out.println("获取的表单项的name值:"+f.getFieldName());
// 参数UTF-8解决乱码问题
System.out.println("获取的表单项的value值:"+f.getString("UTF-8"));
// System.out.println(f.getFieldName()+f.getString("UTF-8"));
}else {
System.out.println("表单项的name属性值:"+f.getFieldName());
System.out.println("上传的文件名:"+f.getName());
Random r = new Random();
int i = r.nextInt(10);
File file = new File("E:\\photo\\"+i+f.getName());
if(file.exists()){
file.delete();
f.write(file);
}else {
f.write(file);
}
// f.write(new File("E:\\photo\\"+i+f.getName()));
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) throws IOException {
File f = new File("e:\\index.txt");
if(f.exists()){
System.out.println(f.delete());
System.out.println(f.createNewFile());
}else {
System.out.println(f.createNewFile());
}
}
}
HTML提交文件页面中的内容:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2022/10/31
Time: 11:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="<c:url value="/ServletEL"/>" enctype="multipart/form-data" method="post">
<table>
<tr>
<td>上传者:</td> <td><input type="text" name="username"></td>
</tr>
<tr>
<td>上传文件:</td> <td><input type="file" name="file"></td>
</tr>
<tr> <td><button type="submit">提交</button></td></tr>
</table>
</form>
</body>
</html>
注意点:
1.关于在部署工件时报错
如果你出现了以上的报错,说明你的lib文件没有完全的引入,你需要将你之前下载的两个jar包复制一份放在Tomcat的lib包下面
2.当你传入的文件路径不存在,即如果E盘下面不存在photo这个文件夹的时候并不会报错,而是自动创建一个photo的文件夹,并将文件写入进去,这跟File类的创建文件的参数有关
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153347.html