目录
6.8、文件上传
JSP要是先文件的上传需要使用Commons-FileUpload 组件,可以下载jar包,也可以直接使用依赖
-
下载jar文件:commons-fileupload和 commons-io 导入lib中即可
-
使用 pom加载相关依赖
<!--文件上传组件--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency>
Commons-FileUpload 组件的接口和实现类:
-
FileItemFactory工厂:创建 ServletFileUpload 实例
方 法 说 明 void setSizeThreshold(int sizeThreshold) 设置内存缓冲区的大小 void setRepository(String path) 设置临时文件存放的目录 -
ServletFileUpload类:用于实现文件上传操作
方 法 说 明 void setSizeMax(long sizeMax) 设置上传文件总量的最大值 List parseRequest(HttpServletRequest req) 解析 form 表单提交的数据,返回一个 FileItem 实例的集合 boolean isMultipartContent(HttpServletRequest req) 判断请求信息中的内容是否是”multipart/form-data“类型,是则返回 true,否则返回 false。 void setHeaderEncoding(String encoding) 设置转换时所使用的字符集编码 -
FileItem 接口:用于封装单个表单字段元素的数据,一个表单字段对应一个 FileItem 实例
方 法 说 明 boolean isFormField() 用于判断 FileItem 类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回 true,否则返回 false。 String getName() 获取文件上传的文件名 String getFieldName() 返回表单字段元素的 name 属性值 long getSize() 获取上传文件的大小 String getString() 将 FileItem 对象中保存的主体内容以一个字符串返回。 void write() 将 FileItem 对象中保存的主体内容保存到指定的文件中。
文件上传时表单的method 要设置成 post,enctype 设置成 ultipart/form-data(将上传的数据设置成二进制),action设置对应的servlet处理上传的文件,使用 input 的 file上传文件。
<form action="${pageContext.request.contextPath}/UploadFileServlet" method="post" enctype="multipart/form-data">
上传文件:<input type="file" name="file">
<br/>
<input type="submit" value="提交">
</form>
//servlet处理文件
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 判断是否为multipart/form-data
if (!ServletFileUpload.isMultipartContent(request)) {
request.setAttribute("message", "必须为multipart/form-data数据");
}else {
// 配置FileItemFactory工厂
FileItemFactory factory = new DiskFileItemFactory();
// 创建用于解析数据的工具类ServletFileUpload类
ServletFileUpload upload = new ServletFileUpload(factory);
// 防止上传文件名称乱码
upload.setHeaderEncoding("UTF-8");
// 构造临时路径来存储上传的文件
String uploadPath = "D:\\ideaWork\\servlet\\src\\upload";
// 如果目录不存在则创建
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
try {
// 解析请求的内容提取文件数据
List<FileItem> formItems = upload.parseRequest(request);
if (formItems != null && formItems.size() > 0) {
// 迭代表单数据,判断每个表单项是普通类型还是上传的文件
for (FileItem item : formItems) {
//上传的数据为文件的表单项处理方式
if (!item.isFormField()) {
//文件名
String fileName = item.getName();
System.out.println("文件名:"+fileName);
// 保存的路径
String filePath = uploadPath + File.separator + fileName;
System.out.println(filePath);
// 保存文件到硬盘
File storeFile = new File(filePath);
item.write(storeFile);
request.setAttribute("message", "文件上传成功!");
}
}
}
} catch (Exception ex) {
request.setAttribute("message", "错误信息: " + ex.getMessage());
}
// 跳转到 message.jsp
request.getRequestDispatcher("/jsp/message.jsp").forward(request, response);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
结果:${message}
</body>
</html>