文件上传
1.准备工作#
jar包
commons-io
commons-fileup
2.使用类介绍#
文件上传注意事项#
常用的类#
实现思想:#
//1.创建 DiskFileItemFactory 对象,处理文件上传路径和大小的限制
DiskFileItemFactory diskFileItemFactory = getDiskFileItemFactory(tmpFile);
//2.获取 ServletFileUpload
ServletFileUpload servletFileUpload = getServletFileUpload(diskFileItemFactory);
//3. 处理上传的文件
//每一个表单里面的标签就是一个FIleItem对象
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
文件名#
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写。
代码实现:#
package com.cb.test;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.junit.jupiter.api.Test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;
public class Test1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//判断是带文件的表单还是不带文件的表单
//web wind里面的吧,在得到bai上传文件之前,首先要判断客du户端zhi<form>标记的enctype属性是否是“multipart/form-data"。
//也可以说是判断是普dao通表单,还是带文件上传的表单。文件上传的表单值不能按普通表单接收值那样直接获取。
if(!ServletFileUpload.isMultipartContent(req)){
return;//终止方法
}
//创建文件存放保存目录和临时保存目录,WEB-INF下安全,无法直接被访问
String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
File uploadFile = new File(uploadPath);
if(!uploadFile.exists()){
uploadFile.mkdir();
}
//文件太大,放在临时文件
String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");
File tmpFile = new File(tmpPath);
if(!tmpFile.exists()){
tmpFile.mkdir();
}
//上传文件,一般需要通过流来获取,原生req.getInputStream()
//这里我们用apache的上传文件组件,commons- fileUpload,依赖commons-io包
//1.创建 DiskFileItemFactory 对象,处理文件上传路径和大小的限制
DiskFileItemFactory diskFileItemFactory = getDiskFileItemFactory(tmpFile);
//2.获取 ServletFileUpload
ServletFileUpload servletFileUpload = getServletFileUpload(diskFileItemFactory);
//3. 处理上传的文件
try {
uploadParseRequest(servletFileUpload,req,uploadPath);
} catch (FileUploadException e) {
e.printStackTrace();
}
}
private String uploadParseRequest(ServletFileUpload servletFileUpload,HttpServletRequest request,String uploadPath) throws FileUploadException, IOException {
String msg = "";
//每一个表单里面的标签就是一个FIleItem对象
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem fileItem : fileItems) {
//判断FIleItem对象是不是 带文件的标签 false代表是一个上传文件
if (fileItem.isFormField()) {
//字段名
String fieldName = fileItem.getFieldName();
//h获取值
String value = fileItem.getString("utf-8");
System.out.println("key:" + fieldName + "value" + value);
} else {
//------------------处理文件------------------//
//------------------获取文件路径------------------//
//获取文件名,有些浏览器带路径名,有些不带路径
String uploadFileName = fileItem.getName();
if (uploadFileName.trim().equals("") || uploadFileName == null) {
continue;
}
//获取文件名 /image/guti/ada.png -> ada.png
String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
//获取文件名后缀
String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
System.out.println("文件名:" + fileName + "后缀名" + fileExtName);
//UUID 唯一标识符
String uuid = UUID.randomUUID().toString();
//文件的真实路径
String realPath = uploadPath + "/" + uuid;
//为每一个文件创建一个对应的文件夹
File realPathFile = new File(realPath);
if (!realPathFile.exists()) {
realPathFile.mkdir();
}
//------------------保存文件------------------//
//上传文件输入流
InputStream inputStream = fileItem.getInputStream();
//创建上传文件输出到磁盘流
System.out.println(realPath + "/" + fileName);
FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);
//定义缓存区
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, len);
}
//关闭流
inputStream.close();
fileOutputStream.close();
System.out.println("文件上传成功");
//删除临时文件
fileItem.delete();
}
}
return msg;
}
private ServletFileUpload getServletFileUpload(FileItemFactory diskFileItemFactory) {
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//监听文件上传进度
servletFileUpload.setProgressListener(new ProgressListener() {
@Override
public void update(long pBytesRead, long pContentLength, int pItems) {
//pBytesRead 已读 pContentLength 文件大小
System.out.println("已经上传:"+ pBytesRead + "--总大小 " + pContentLength);
}
});
//处理乱码问题
servletFileUpload.setHeaderEncoding("utf-8");
//设置单个文件最大值
servletFileUpload.setFileSizeMax(1024*1024*10);
// 设置总共能上传文件最大值
servletFileUpload.setSizeMax(1024*1024*10);
return servletFileUpload;
}
private DiskFileItemFactory getDiskFileItemFactory(File file) {
//设置文件大小和 临时文件保存目录
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setSizeThreshold(1024*1024);
diskFileItemFactory.setRepository(file);
return diskFileItemFactory;
}
}
作者:Esofar
出处:https://www.cnblogs.com/firsthelloworld/p/13555094.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!