1.ServletFileUpload文件上传
ServletFileUpload方式文件上传依赖commons-fileupload组件。
对于commons-fileupload组件介绍:FileUpload依据规范RFC1867中”基于表单的HTML文件上载”对上传的文件数据进行解析,解析出来的每个项目对应一个FileItem对象。
每个FileItem都有我们可能所需的属性:获取contentType,获取原本的文件名,获取文件大小,获取FiledName(如果是表单域上传),判断是否在内存中,判断是否属于表单域等。
FileUpload使用FileItemFactory创建新的FileItem。该工厂可以控制每个项目的创建方式。目前提供的工厂实现可以将项目的数据存储临时存储在内存或磁盘上,具体取决于项目的大小(即数据字节,在指定的大小内时,存在内存中,超出范围,存在磁盘上)。
2.常用的一些方法:
FileItemFactory:表单项工厂接口
ServletFileUpload:文件上传类,用于解析上传的数据
FileItem:表单项类,表示每一个表单项
public List parseRequest(HttpServletRequestrequest):解析上传的数据,返回包含表单项的List集合
String FileItem.getFieldName():获取表单项的 name 属性值
String FileItem.getString():获取当前表单项的值;
String FileItem.getName():获取上传的文件名
void FileItem.write(file):将上传的文件写到 参数 file 所指向存取的硬盘位置
3.创建项目
4.pom依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
5.配置Tomcat
先应用后确定
6.pom依赖新增:添加所需依赖后重新加载maven
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
web.xml中新增内容
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/FileUploadServlet</url-pattern>
</servlet-mapping>
7.index.jsp文件代码
<%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>文件上传</title></head><body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="name"><br>
文件1:<input type="file" name="f1"><br>
文件2:<input type="file" name="f2"><br>
<input type="submit" value="提交"></form></body></html>
8.FileUploadServlet代码
新建java目录
在目录下建立FileUploadServlet类
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* 文件上传 Servlet
*/
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 定义文件存储路径
String realPath = "/Users/admin/upload"; // 文件存储目录
String tempPath = "/Users/admin/temp"; // 临时文件目录
// 创建存储目录
File uploadDir = new File(realPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
File tempDir = new File(tempPath);
if (!tempDir.exists()) {
tempDir.mkdirs();
}
// 创建文件上传工厂和解析器
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(tempDir);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setFileSizeMax(1024 * 1024 * 50); // 单个文件最大 50MB
upload.setSizeMax(1024 * 1024 * 100); // 总文件大小最大 100MB
// 打印日志
System.out.println("文件存储路径:" + realPath);
System.out.println("临时文件路径:" + tempPath);
System.out.println("文件大小限制(单个文件):" + upload.getFileSizeMax() + " 字节");
System.out.println("文件大小限制(总大小):" + upload.getSizeMax() + " 字节");
// 判断是否为文件上传表单
if (!ServletFileUpload.isMultipartContent(req)) {
resp.getWriter().write("不是文件上传表单");
return;
}
try {
// 解析请求
List<FileItem> items = upload.parseRequest(req);
for (FileItem item : items) {
if (item.isFormField()) {
// 普通表单字段
String fieldName = item.getFieldName();
String fieldValue = item.getString("UTF-8");
System.out.println("普通字段:" + fieldName + " = " + fieldValue);
} else {
// 文件上传字段
String fileName = item.getName();
if (fileName == null || fileName.trim().isEmpty()) {
continue;
}
fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
String filePath = realPath + File.separator + fileName;
// 保存文件
try (InputStream in = item.getInputStream();
OutputStream out = new FileOutputStream(filePath)) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
}
// 删除临时文件
item.delete();
System.out.println("文件上传成功:" + fileName);
}
}
} catch (FileUploadBase.SizeLimitExceededException e) {
resp.getWriter().write("上传失败:文件大小超出限制!");
e.printStackTrace();
} catch (FileUploadException e) {
resp.getWriter().write("文件上传失败:" + e.getMessage());
e.printStackTrace();
}
}
}
9.运行效果