package com.jsptest.action;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadFileAction extends HttpServlet{
/**
* 文件上传,使用commons-fileupload-1.3.3.jar和commons-io-2.4.jar 两个包进行文件上传
*/
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
//判断是否是一个多部分文件内容
boolean isMultiPart = ServletFileUpload.isMultipartContent(req) ;
//步骤1:完成文件夹的建立
//步骤1-1:存储文件位置的文件夹
//获取当前项目的绝对路径
Date date = new Date() ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd") ;
String strDate = sdf.format(date) ;
String realPath = req.getSession().getServletContext().getRealPath("/upload" + "/" + strDate) ;
File path = new File(realPath) ;
//判断文件夹是否存在
if(!path.exists()) {
path.mkdirs() ;
}
//步骤1-2:设置临时文件夹的大小
File fileTempDir = new File("fileDir") ;
if(!fileTempDir.exists()) {
fileTempDir.mkdirs() ;
}
//步骤2:需要判断是否是一个文件
if(isMultiPart) {
//步骤2-1:建立磁盘工厂
DiskFileItemFactory factory = new DiskFileItemFactory() ;
//设置临时缓冲区大小
factory.setSizeThreshold(4096);
//使用工厂设置临时目录
factory.setRepository(fileTempDir);
//使用servletFileUpload进行文件上传,将磁盘工厂放到servlet中,使用http协议进行文件的上传
ServletFileUpload fileUpload = new ServletFileUpload(factory) ;
//设置最大的上传文件大小
fileUpload.setFileSizeMax(1024 * 1024 * 100);
try {
//步骤2-2:通过ServletUpload进行request的转换
List<FileItem> fileItems =fileUpload.parseRequest(req);
//将表单中的所有表单字段都返回为fileItem的集合,用于判断上传的是否是文件
for(FileItem fileItem : fileItems) {
//不是一个字段,就是一个上传的文件
if(!fileItem.isFormField()) {
String fileName = fileItem.getName() ;
//获取文件名用途1:需要判断当前上传的文件是否使我们所允许上传的类型 1.mp3.txt.jpg
String ext = fileName.substring(fileName.lastIndexOf(".") + 1) ;
//System.out.println("==============ext==="+ext);
List<String> types = Arrays.asList("jpg","txt","png") ;
//如果需要打印types的结合 必须的将其转换为list集合的后才能进行使用
List<String > list=new ArrayList<String>(types);
// for (String type:list) {
// System.out.println("types==="+type);
// }
if(!list.contains(ext)) {
System.out.println("当前文件类型不允许上传!");
}
//获取文件名用途2:对上传的文件名进行重命名
String fileNewName = UUID.randomUUID().toString() ;
//保存文件
File newFile = new File(fileNewName + "." + ext) ;
//创建一个父路径realPath下的一个文件名为newFile.getName()的文件
File saveFile = new File(realPath,newFile.getName()) ;
//写出文件,使用流的形式进行文件的写出write(saveFile)此方法是fileItem内部的一个void类型的方法,主要适用于将文件进行写出到指定的文件夹下,并参删除临时文件夹
fileItem.write(saveFile);
//拿到文件的句对路径
String fileRecPath = saveFile.getAbsoluteFile().toString() ;
//将该值放在数据库中存储,从当前文件夹下进行文件真实名称的截取
String fileNewPath = fileRecPath.substring(fileRecPath.indexOf("\\upload")) ;
System.out.println("==============fileNewPath==="+fileNewPath);
//将文件的真实路径放到setAttribute()中,发送到前端进行显示
req.setAttribute("filePath",fileNewPath);
}else{
//判断当前运行的字段是哪一个字段,并且重新赋值
if("username".equals(fileItem.getFieldName())) {
String username = fileItem.getString() ;
System.out.println("username = " + username);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
req.getRequestDispatcher("/index1.jsp").forward(req,resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<!-- enctype="multipart/form-data"文件上传的时候这个选项一定要选,用于识别文件和表单字段 -->
<form action="UploadFileAction" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<br/>
<input type="text" name="username" />
<input type="submit" value="上传" />
</form>
</body>
</html>
//转发的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<img src="${filePath}">
<img src="upload\20200608\7114556b-f6ea-45b3-8a26-6c0f194e6b37.jpg" />
</body>
</html>