import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 文件上传工具类
*/
public class UploadFileUtile {
public static Map<String,Object> formData = new HashMap();
public static boolean upload(HttpServletRequest request){
//1.创建文件上传工厂对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//2.创建文件上传的组件
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//3.设置文件上传的编码集
servletFileUpload.setHeaderEncoding("UTF-8");
try {
//整体文件最大不能超过多少 B KB 100MB
servletFileUpload.setSizeMax(100*1024*1024);
//单个文件最大不能超过多少
servletFileUpload.setFileSizeMax(5*1024*1024);
//4.获取请求对象塞入到上传组件中
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem fileItem : fileItems){
if(fileItem.isFormField()){
//普通表单元素key value塞入到formData对象
formData.put(fileItem.getFieldName(),fileItem.getString());
}else{
InputStream is = fileItem.getInputStream();//获取文件的输入流
//源文件名称
String sourceFileName = fileItem.getName();//图片源文件名称
System.out.println("源文件名称:"+sourceFileName);
String tarGetFileName = tarGetFileName(sourceFileName);
System.out.println("目标文件名称:"+tarGetFileName);
String uploadDiskPath = request.getRealPath("/");//获取当前项目的绝对路径
System.out.println("获取当前项目的绝对路径"+uploadDiskPath);
// String resourcePath = request.getServletContext().getRealPath("/WEB-INF/Files/");
//创建一个输出流实现文件的上传功能
// D:\apache-tomcat-8.5.31\webapps\ROOT\\2024011522213600000.png
OutputStream os = new FileOutputStream(uploadDiskPath+File.separator+tarGetFileName);
System.out.println("文件路径:"+uploadDiskPath+File.separator+tarGetFileName);
byte[] by = new byte[1024];
int len;
while((len = is.read(by)) != -1){
os.write(by,0,len);
}
//讲文件名存储到session域中
ArrayList<String> images = (ArrayList<String>) request.getSession().getAttribute("images");
if (images == null || images.size() == 0){
images = new ArrayList<>();
}
images.add(tarGetFileName);
request.getSession().setAttribute("images",images);
os.flush();
os.close();
is.close();
//把相对路径的图片地址塞给formData
formData.put(fileItem.getFieldName(),/*relativePath+*/tarGetFileName);
}
}
//文件上传成功
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 创建文件,将相对路径返回。(上面没有用到)
*/
public static String createUploadFilePath(String uploadDiskPath){
String filePath = File.separator+"upload"+File.separator;
File file = new File(uploadDiskPath+filePath);
if(!file.exists()){//如果E没有upload目录就创建一个,有就算了
file.mkdirs();
}
return filePath;
}
/**
* 传入源文件名称 zxy.jpg 生成 202110291431020001.jpg(给文件重命名及限制文件后缀)
* @param sourceFileName
* @return
*/
public static String tarGetFileName(String sourceFileName){
String fileName = GenerateSequenceUtil.generateSequenceNo();//获取时间戳
String ext = sourceFileName.substring(sourceFileName.lastIndexOf(".")); //.jpg
//上传.jpg .png .gif
String allowExt = ".jpg|.png|.gif|.jpeg|.docx|.pdf";//用于限制文件上传格式
if(allowExt.lastIndexOf(ext) == -1){//未找到了
throw new NotAllowExtException("不允许上传此类型文件");
}
//目标文件名称
String tarGetFileName = fileName+ext;//例如: 202110291431020001.jpg
return tarGetFileName;
}
}
上传文件需要的依赖
```java
在这里插入代码片
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--Mysql数据库JDBC依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
servlet层
@WebServlet("/system/*")
public class systemServlet extends BaseServlet {
//上传文件
public void uploadFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("查询职称表信息");
R r = new R();
boolean upload = UploadFileUtile.upload(request);
if(upload){
r.setData(UploadFileUtil1.formData);
r.setCode(0);
}
System.out.println("多条件查询返回值给页面");
//回写响应
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(JSONObject.toJSONString(r));
}
}
BaseServlet
/**
* 由于每一次请求都要创建一个Servlet,将来会有特别多的servlet,不利于管理
*
* Servlet优化
*
* /brand/* *代表对应的方法名
* /user/*
*
* 关键点1:获取最后路径这一个方法名
* 关键点2:通过反射以及this当前对象获取对应的字节码文件,通过invoke调用其方法完成方法的分发
*/
public class BaseServlet extends HttpServlet {
/*
方法的分发
源码里是通过请求的方式来进行方法的分发,
但我们需要通过路径名来完成对应的方法分发,因此需要重写
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取对应的请求路径
String uri = req.getRequestURI();
//2./brand/* 截取这个*对应的方法名
int index = uri.lastIndexOf('/');//从后往前数的一个/对应的下标
// selectAll? /selectAll?
String methodName = uri.substring(index + 1);//这样通过打印结果得知截取的是/methodName 因此需要下标+1来截取完整方法名
//3.执行方法
//3.1获取对应的字节码文件 .class
//谁调用我(this 所在的方法),我(this)代表谁
Class<? extends BaseServlet> cls = this.getClass(); //谁是this? BrandServlet? HttpServlet? BrandServlet?
try {
//通过类对象,以及方法名,定位对应的方法
Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//执行该方法,完成方法的分发
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}