1、首先需要导入依赖包
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
2、获取文件存放目录
// 判断表单是否带有文件
// if(!ServletFileUpload.isMultipartContent(req))
// return;
// 1、获取文件存储路径
String realPath = this.getServletContext().getRealPath("/WEB-INF/upload");
System.out.println(realPath);
// 2、正常都是预先创建好的
File filePath = new File(realPath);
if(!filePath.exists())
filePath.mkdirs();
// 3、获取大文件临时存储路径
String tempPath = this.getServletContext().getRealPath("/WEB-INF/tempPath");
File tempFile = new File(tempPath);
if(!tempFile.exists())
tempFile.mkdirs();
/**
* 使用Apache文件上传组件处理文件上传步骤:
*
* */
//4、设置环境:创建一个DiskFileItemFactory工厂,处理文件上传路径或者大小限制
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(tempFile);
//5、核心操作类:创建一个文件上传解析器。
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//设置上传文件名的中文乱码
fileUpload.setHeaderEncoding("utf-8");
//设置单个文件上传大小 2M
// fileUpload.setFileSizeMax(2*1024*1024);
fileUpload.setFileSizeMax(2*1024*1024);
//设置总上传文件大小(有时候一次性上传多个文件,需要有一个上限,此处为10M)
// fileUpload.setSizeMax(10*1024*1024);
fileUpload.setSizeMax(10*1024*1024);
//6、可以监听文件上传进度
fileUpload.setProgressListener(new ProgressListener() {
/**
* @param bytesRead 已经读取的字节数
* @param contentLength 文件总长度
* @param items 当前上传的是哪个文件
*/
@Override
public void update(long bytesRead, long contentLength, int items) {
System.out.println("已经读取:"+bytesRead);
System.out.println("文件总大小:"+contentLength);
System.out.println("第:"+items+"个文件"); }
});
//7、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
try {
List<FileItem> fileItems = fileUpload.parseRequest(req);
for (FileItem item : fileItems)
{
if(item.isFormField()){
String filedName = item.getFieldName();//普通输入项数据的名
//解决普通输入项的数据的中文乱码问题
String filedValue = item.getString("UTF-8");//普通输入项的值
System.out.println("普通字段:"+filedName+"=="+filedValue);
}else{
//如果fileitem中封装的是上传文件,得到上传的文件名称,
String fileName = item.getName();//文件名
//多个文件上传输入框有空 的 异常处理
if(fileName==null || "".equals(fileName.trim())){ //去空格是否为空
continue;// 为空,跳过当次循环, 第一个没输入则跳过可以继续输入第二个
}
fileName = fileName.substring(fileName.lastIndexOf("\")+1);
//拼接上传路径。存放路径+上传的文件名
String fileRealPath = realPath+"\"+fileName;
//构建输入输出流
InputStream in = item.getInputStream(); //获取item中的上传文件的输入流
OutputStream out = new FileOutputStream(fileRealPath); //创建一个文件输出流
//创建一个缓冲区
byte b[] = new byte[1024];
//判断输入流中的数据是否已经读完的标识
int len = 0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据
while((len=in.read(b)) != -1){ //没数据了返回-1
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\"+filename)当中
out.write(b, 0, len);
}
//关闭流
out.close();
in.close();
//删除临时文件
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
item.delete();//删除处理文件上传时生成的临时文件
System.out.println("文件上传成功");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}