SpringBoot3文件管理

标签:上传.下载.Excel.导入.导出;

一、简介

在项目中,文件管理是常见的复杂功能;

首先文件的类型比较多样,处理起来比较复杂,其次文件涉及大量的IO操作,容易引发内存溢出;

不同的文件类型有不同的应用场景;

比如:图片常用于头像和证明材料;Excel偏向业务数据导入导出;CSV偏向技术层面数据搬运;PDF和Word用于文档类的材料保存等;

下面的案例只围绕普通文件Excel两种类型进行代码实现;

二、工程搭建

1、工程结构

2、依赖管理

普通文件的上传下载,依赖spring-boot框架即可,而Excel类型选择easyexcel组件,该组件内部依赖了apache-poi组件的4.1.2版本;

<!-- 基础框架组件 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version>
</dependency><!-- Excel组件 -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion></exclusions>
</dependency>

三、上传下载

1、配置管理

在配置文件中,添加max-file-size单个文件大小限制和max-request-size请求最大限制两个核心参数;

需要说明的一点是:如何设定参数值的大小,与业务场景和服务器的处理能力都有关系,在测试的过程中优化即可;

spring:# 文件配置servlet:multipart:enabled: true# 文件单个限制max-file-size: 10MB# 请求最大限制max-request-size: 20MB

2、上传下载

这里提供一个文件批量上传接口和一个文件下载接口,把文件管理在工程中的resources/file目录下,下载接口中需要指定该目录下的文件名称;

@RestController
public class FileWeb {private static final Logger logger = LoggerFactory.getLogger(FileWeb.class);@Resourceprivate FileService fileService ;/*** 文件上传*/@PostMapping("/file/upload")public String upload (HttpServletRequest request,@RequestParam("file") MultipartFile[] fileList) throws Exception {String uploadUser = request.getParameter("uploadUser");if (uploadUser.isEmpty()){return "upload-user is empty";}logger.info("upload-user:{}",uploadUser);for (MultipartFile multipartFile : fileList) {// 解析文件信息和保存fileService.dealFile(multipartFile);}return "success" ;}/*** 文件下载*/@GetMapping("/file/download")public void upload (@RequestParam("fileName") String fileName,HttpServletResponse response) throws Exception {if (!fileName.isBlank()){String filePath = ResourceUtils.getURL("m1-04-boot-file/src/main/resources/file").getPath();File file = new File(filePath,fileName) ;response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));response.setContentType("application/octet-stream");Files.copy(Paths.get(file.getPath()), response.getOutputStream());}}
}/*** 文件服务类*/
@Service
public class FileService {private static final Logger logger = LoggerFactory.getLogger(FileService.class);public void dealFile (MultipartFile multipartFile) throws Exception {logger.info("Name >> {}",multipartFile.getName());logger.info("OriginalFilename >> {}",multipartFile.getOriginalFilename());logger.info("ContentType >> {}",multipartFile.getContentType());logger.info("Size >> {}",multipartFile.getSize());// 文件输出地址String filePath = ResourceUtils.getURL("m1-04-boot-file/src/main/resources/file").getPath();File writeFile = new File(filePath, multipartFile.getOriginalFilename());multipartFile.transferTo(writeFile);}
}

使用Postman测试文件批量上传接口:

四、Excel文件

1、Excel创建

基于easyexcel组件中封装的EasyExcel工具类,继承自EasyExcelFactory工厂类,实现Excel单个或多个Sheet的创建,并且在单个Sheet中写多个Table数据表;

@Service
public class ExcelService {/*** Excel-写单个Sheet*/public static void writeSheet () throws Exception {// 文件处理String basePath = getAbsolutePath();File file = new File(basePath+"/easy-excel-01.xlsx") ;checkOrCreateFile(file);// 执行写操作EasyExcel.write(file).head(DataVO.class).sheet(0,"用户信息").doWrite(DataVO.getSheet1List());}/*** Excel-写多个Sheet*/public static void writeSheets () throws Exception {// 文件处理String basePath = getAbsolutePath();File file = new File(basePath+"/easy-excel-02.xlsx") ;checkOrCreateFile(file);ExcelWriter excelWriter = null;try {excelWriter = EasyExcel.write(file).build();// Excel-Sheet1WriteSheet writeSheet1 = EasyExcel.writerSheet(0,"分页1").head(DataVO.class).build();// Excel-Sheet2WriteSheet writeSheet2 = EasyExcel.writerSheet(1,"分页2").head(DataVO.class).build();// Excel-Sheet3,写两个TableWriteSheet writeSheet3 = EasyExcel.writerSheet(2,"分页3").build();WriteTable dataTable = EasyExcel.writerTable(0).head(DataVO.class).build();WriteTable dataExtTable = EasyExcel.writerTable(1).head(DataExtVO.class).build();// 执行写操作excelWriter.write(DataVO.getSheet1List(), writeSheet1);excelWriter.write(DataVO.getSheet2List(), writeSheet2);excelWriter.write(DataVO.getSheet1List(),writeSheet3,dataTable) ;excelWriter.write(DataExtVO.getSheetList(),writeSheet3,dataExtTable) ;} catch (Exception e){e.printStackTrace();} finally {if (excelWriter != null){excelWriter.close();}}}
}/*** 实体类,这里的注解会解析为Excel中的表头*/
public class DataVO {@ExcelProperty("编号")private Integer id ;@ExcelProperty("名称")private String name ;@ExcelProperty("手机号")private String phone ;@ExcelProperty("城市")private String cityName ;@ExcelProperty("日期")private Date date ;
}

文件效果:

2、Excel读取

对于读取Excel文件来说,则需要根据具体的样式来定了,在easyexcel组件中还可以添加读取过程的监听器;

@Service
public class ExcelService {/*** Excel-读取数据*/public static void readExcel () throws Exception {// 文件处理String basePath = getAbsolutePath();File file = new File(basePath+"/easy-excel-01.xlsx") ;if (!file.exists()){return ;}// 读取数据List<DataVO> dataList = EasyExcel.read(file).head(DataVO.class).sheet(0).headRowNumber(1).doReadSync();dataList.forEach(System.out::println);}/*** Excel-读取数据使用解析监听器*/public static void readExcelListener () throws Exception {// 文件处理String basePath = getAbsolutePath();File file = new File(basePath+"/easy-excel-01.xlsx") ;if (!file.exists()){return ;}// 读取数据,并且使用解析监听器DataListener dataListener = new DataListener() ;List<DataVO> dataSheetList = EasyExcel.read(file,dataListener).head(DataVO.class).sheet(0).headRowNumber(1).doReadSync();dataSheetList.forEach(System.out::println);}
}

3、解析监听

继承AnalysisEventListener类,并重写其中的方法,可以监听Excel的解析过程,或者添加一些自定义的处理逻辑;

public class DataListener extends AnalysisEventListener<DataVO> {/*** 接收解析的数据块*/@Overridepublic void invoke(DataVO data, AnalysisContext context) {System.out.println("DataListener:"+data);}/*** 接收解析的表头*/@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("DataListener:"+headMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("DataListener:after...all...analysed");}
}

4、导入导出

实际上Excel文件的导入导出,原理与文件的上传下载类似,只不过这里使用easyexcel组件中的API来直接处理Excel的写和读;

@RestController
public class ExcelWeb {@GetMapping("excel/download")public void download(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("Excel数据", StandardCharsets.UTF_8).replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), DataVO.class).sheet("用户").doWrite(DataVO.getSheet1List());}@ResponseBody@PostMapping("excel/upload")public String upload(@RequestParam("file") MultipartFile file) throws IOException {List<DataVO> dataList = EasyExcel.read(file.getInputStream(), DataVO.class, new DataListener()).sheet().doReadSync();dataList.forEach(System.out::println);return "success";}
}

使用Postman测试单个Excel上传接口:

五、参考源码

文档仓库:
https://gitee.com/cicadasmile/butte-java-note源码仓库:
https://gitee.com/cicadasmile/butte-spring-parent

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60070.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MuMu模拟器运行一段时间后Device.Present耗时突然上升

1&#xff09;MuMu模拟器运行一段时间后Device.Present耗时突然上升 2&#xff09;​如何在运行过程中获得温度信息 3&#xff09;Input System鼠标更换主按键的Bug 4&#xff09;如何禁止Unity向https://config.uca.cloud.unity3d.com发送设备信息 这是第347篇UWA技术知识分享…

docker小白第二天

centos上安装docker docker官网&#xff0c;docker官网&#xff0c;找到下图中的doc文档。 进入如下页面 选中manuals&#xff0c;安装docker引擎。 最终centos下的docker安装文档链接&#xff1a;安装文档链接. 具体安装步骤&#xff1a; 1、打开Centos&#xff0c;输入命…

python爬虫实战(1)--爬取新闻数据

想要每天看到新闻数据又不想占用太多时间去整理&#xff0c;萌生自己抓取新闻网站的想法。 1. 准备工作 使用python语言可以快速实现&#xff0c;调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install BeautifulSoup完成以后引入项目 2. 开发 定义请求头&#xf…

[IDEA]使用idea比较两个jar包的差异

除了一些小工具外&#xff0c;idea自带了jar包比较的功能。 把需要比对的jar包放到任意目录下&#xff0c;然后选中两个需要比较的jar包&#xff0c;右键&#xff0c;选择Compare Archives&#xff0c;然后就可以比较了。 这次疏忽了&#xff0c;每次打包前需要commit界面看一下…

解决Spring Boot 2.6及之后版本取消了循环依赖的支持的问题

目录 1、问题&#xff1a; 2、报错&#xff1a; 3、解决方案&#xff1a; 1、问题&#xff1a; 循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环。直接表现为两个service层互相调用对方。 此时会遇到以下问题&#xff1a; 2、报错&#xff1a; 当启动项目时&…

【Shell】基础语法(三)

文章目录 一、Shell基础语法1. 位置参数和特殊变量2. 输入输出3. 管道4. 文件重定向5. 函数6. 脚本调试方法 二、Shell高级和正则表达式1. sort命令2. uniq命令3. wc命令4. grep命令5. find命令6. xargs7. sed命令8. crontab 一、Shell基础语法 1. 位置参数和特殊变量 $0 …

wordpress 打开缓慢处理

gravatar.com 头像网站被墙 追踪发现请求头像时长为21秒 解决方案一 不推荐&#xff0c;容易失效&#xff0c;网址要是要稳定为主&#xff0c;宁愿头像显示异常&#xff0c;也不能网址打不开 网上大部分搜索到的替换的CDN网址都过期了&#xff0c;例如&#xff1a;gravatar.du…

ArcGIS Pro实践技术应用暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

css-4:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

1、背景 在开发中&#xff0c;经常遇到这个问题&#xff0c;即让某个元素的内容在水平和垂直方向上都居中&#xff0c;内容不仅限于文字&#xff0c;可能是图片或其他元素。 居中是一个非常基础但又是非常重要的应用场景&#xff0c;实现居中的方法存在很多&#xff0c;可以将这…

EPS FB 2.5S返回时延占比提升

一、 EPS FB 2.5s指标现状 3月初某区域的EPS FB返回时延占比为82.7%左右&#xff0c;离目标值83.98%还有1.2%。 二、 原因分析 EPS FB语音挂机后&#xff0c;UE在LTE恻可以通过快速返回Fast Return功能快速回到SA模式&#xff0c;4G侧快速返回功能为: 1、NR Coverage-Trigger…

【深度学习笔记】深度学习框架

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》