EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端

产品需求:

前端上传个csv 或 excel 文件,文件共4列,验证文件大小,类型,文件名长度,文件内容,如果某行某个单元格数据验证不通过,就把错误信息放到这行第五列,然后把带有错误信息的文件,返回给前端。

    @ApiOperation(value = "上传新增")@PostMapping(path = "uploadFile")public ResultMsg<?> uploadExcelFile(@RequestParam("file") MultipartFile file) throws IOException {if (file.getOriginalFilename().length() > 256) {return ResultMsg.failed("文件名超长");}if (file.getSize() > 3 * 1024 * 1024) {return ResultMsg.failed("文件太大");}String fileType = Optional.ofNullable(file.getOriginalFilename()).map(name -> name.substring(name.lastIndexOf("."))).orElse(null);if (!".xls".equalsIgnoreCase(fileType) && !".xlsx".equalsIgnoreCase(fileType) && !".csv".equalsIgnoreCase(fileType)) {return ResultMsg.failed("仅支持 [xls xlsx csv] 格式");}StyleOfWritingExcelDTO dto = null;try {dto = this.validateAndReadExcel(file.getInputStream());} catch (IOException e) {throw new RuntimeException(e);}if (dto.getHasError()) {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();EasyExcel.write(byteArrayOutputStream, StyleOfWritingExcelModel.class)
//                        .excelType(ExcelTypeEnum.XLSX).sheet("sheet1").doWrite(dto.getStyleOfWritingExcelModelList());String base64Str = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());Map<Object, Object> base64Map = new HashMap<>();base64Map.put("errStr", "文件内容不合格");base64Map.put("fileData", base64Str);return ResultMsg.failed(4001, "文件内容不合格", base64Map);}if (dto.getStyleOfWritingExcelModelList().isEmpty()) return ResultMsg.failed("文件内容为空");saveData(dto.getStyleOfWritingExcelModelList());return ResultMsg.success();}private StyleOfWritingExcelDTO validateAndReadExcel(InputStream inputStream) {StyleOfWritingExcelDTO result = new StyleOfWritingExcelDTO();List<StyleOfWritingExcelModel> dataList = new ArrayList<>();EasyExcel.read(inputStream, StyleOfWritingExcelModel.class, new AnalysisEventListener<StyleOfWritingExcelModel>() {@Overridepublic void invoke(StyleOfWritingExcelModel styleOfWritingExcelModel, AnalysisContext analysisContext) {StringBuilder errorInfo = new StringBuilder();CategoryEntity firstCategory = null;if (StringUtils.isBlank(styleOfWritingExcelModel.getFirstCategoryName())) {errorInfo.append("品类不能为空;");} else if (styleOfWritingExcelModel.getFirstCategoryName().length() > 50) {errorInfo.append(String.format("品类名长度超限,限制最大[%d]字符;", 50));} else {firstCategory = this.getCategoryCode(styleOfWritingExcelModel.getFirstCategoryName());if (ObjectUtils.isEmpty(firstCategory))errorInfo.append(String.format("品类在库里未找到;"));elsestyleOfWritingExcelModel.setFirstCategory(firstCategory.getCode());}CategoryEntity secondCategory = null;if (StringUtils.isBlank(styleOfWritingExcelModel.getSecondCategoryName())) {errorInfo.append("二级品类不能为空; ");} else if (styleOfWritingExcelModel.getSecondCategoryName().length() > 50) {errorInfo.append(String.format("二级品类名长度超限,限制最大[%d]字符", 50));} else {secondCategory = this.getCategoryCode(styleOfWritingExcelModel.getSecondCategoryName());if (ObjectUtils.isEmpty(secondCategory))errorInfo.append(String.format("二级品类在库里未找到;"));elsestyleOfWritingExcelModel.setSecondCategory(secondCategory.getCode());}if (ObjectUtils.isNotEmpty(firstCategory) && ObjectUtils.isNotEmpty(secondCategory)) {if (!firstCategory.getCode().equals(secondCategory.getParentCode())) {errorInfo.append(String.format("二级品类 和 品类 不匹配"));}}if (StringUtils.isBlank(styleOfWritingExcelModel.getContent())) {errorInfo.append("内容不能为空; ");} else if (styleOfWritingExcelModel.getContent().length() > 3000) {errorInfo.append(String.format("内容长度超限,限制最大[%d]字符", 3000));}styleOfWritingExcelModel.setErrorInfo(errorInfo.toString());dataList.add(styleOfWritingExcelModel);if (!result.getHasError() && StringUtils.isNotBlank(errorInfo.toString())) {result.setHasError(true);}}private CategoryEntity getCategoryCode(String categoryName) {List<CategoryEntity> categoryList = categoryService.list(new QueryWrapper<CategoryEntity>().lambda().eq(CategoryEntity::getName, categoryName));return categoryList.stream().findFirst().orElse(null);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 解析完成后的操作}}).sheet().doRead();result.setStyleOfWritingExcelModelList(dataList);return result;}返回:{"code": 4001,"message": "文件内容不合格","data": {"fileData": "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","errStr": "文件内容不合格"},"timestamp": 63417752000000
}

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

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

相关文章

机器学习免费使用的数据集及网站链接

机器学习领域存在许多可以免费使用的数据集&#xff0c;这些数据集来自于学习、研究、比赛等目的。 一、综合性数据集平台 1.Kaggle 网址&#xff1a;Kaggle 数据集https://www.kaggle.com/datasets Kaggle是一个数据科学竞赛和社区平台&#xff0c;提供了大量的数据集供用…

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来&#xff0c;Nacos 2.0 在社区的支持下已走过近三年&#xff0c;期间取得了诸多成就。在高性能与易扩展性方面&#xff0c;Nacos 2.0 取得了显著进展&#xff0c;同时在易用性和安全性上也不断提升。想了解更多详细信息&#xff0c;欢迎阅读我们之前发布的回…

IP查询于访问控制保护你我安全

IP地址查询 查询方法&#xff1a; 命令行工具&#xff1a; ①在Windows系统中&#xff0c;我们可以使用命令提示符&#xff08;WINR&#xff09;查询IP地址&#xff0c;在弹窗中输入“ipconfig”命令查看本地网络适配器的IP地址等配置信息&#xff1b; ②在Linux系统中&…

解决 ssh connect to host github.com port 22 Connection timed out

一、问题描述 本地 pull/push 推送代码到 github 项目报 22 端口连接超时&#xff0c;测试连接也是 22 端口连接超时 ssh 密钥没问题、也开了 Watt Toolkit 网络是通的&#xff0c;因此可以强制将端口切换为 443 二、解决方案 1、测试连接 ssh -T gitgithub.com意味着无法通…

如何在Windows 11 WSL2 Ubuntu 环境下安装和配置perf性能分析工具?

在Windows 11 WSL2 Ubuntu 环境下完整安装和配置perf性能分析工具 一、背景二、准备工作三、获取并编译Linux内核源码四、安装和配置perf五、测试perf六、总结 一、背景 由于WSL2使用的是微软定制的内核&#xff0c;并非标准的Ubuntu内核&#xff0c;因此直接使用apt安装linux…

NOVA:AutoRegressive Video Generation Without Vector Quantization——自回归视频生成无需向量量化

这篇文章介绍了一种名为NOVA的新型自回归模型&#xff0c;用于高效的文本到图像和文本到视频生成。以下是文章的主要内容总结&#xff1a; 1. 研究背景与问题 自回归大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;中表现出色&#xff0c;但…

eNSP之家——路由器--入门实例详解

eNSP路由器配置&#xff1a;IP、DHCP与DNS详解-CSDN博客 练习1&#xff1a;两个路由器配置ip地址&#xff0c;并用ping命令测试连通性。 打开ensp&#xff0c;拉进来两个路由器AR2220,再用auto连接两个路由器。 选中两个路由器&#xff0c;右键启动&#xff0c;等待半分钟路由…

Spring 设计模式:经典设计模式

Spring 设计模式&#xff1a;经典设计模式 引言 Spring 框架广泛使用了经典设计模式。 这些模式在 Spring 内部发挥着重要作用。 通过理解这些设计模式在 Spring 中的应用&#xff0c;开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。 经典设计模式 控制反转&am…

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS NEXT】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置R…

STM32-笔记39-SPI-W25Q128

一、什么是SPI&#xff1f; SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且 在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为…

【微服务】8、分布式事务 ( XA 和 AT )

文章目录 利用Seata解决分布式事务问题&#xff08;XA模式&#xff09;AT模式1. AT模式原理引入2. AT模式执行流程与XA模式对比3. AT模式性能优势及潜在问题4. AT模式数据一致性解决方案5. AT模式一阶段操作总结6. AT模式二阶段操作分析7. AT模式整体特点8. AT模式与XA模式对比…

CTF知识点总结(三)

空格绕过方式&#xff1a; $IFS ${IFS} $IFS$数字 < <> 三种绕过方式&#xff1a; 1.sh /?ip127.0.0.1;echo$IFS$2Y2F0IGZsYWcucGhw|base64$IFS$2-d|sh 2.变量拼接 /?ip127.0.0.1;ag;cat$IFS$2fla$a.php 3.内联注释(将反引号命令的结果作为输入来执行命令) /?i…

《Spring Framework实战》5:Spring Framework 概述

欢迎观看《Spring Framework实战》视频教程 Spring 使创建 Java 企业应用程序变得容易。它为您提供一切 需要在企业环境中采用 Java 语言&#xff0c;并支持 Groovy 和 Kotlin 作为 JVM 上的替代语言&#xff0c;并且可以灵活地创建许多 类型的架构。从 Spring Framework 6.0 开…

解决npm报错:sill idealTree buildDeps

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 报错信息 使用 npm 安装依赖时报错&#xff1a;sill idealTree buildDeps 解决方案 请按照以下步骤进行相关操作&#xff1a; 1、删除 C:\Users{账户}\ 文件夹中的 .npm…

formik 的使用

礼记有言&#xff1a;独学而无友&#xff0c;则孤陋而寡闻 让我们一起了解更多便捷方法&#xff0c;缩短开发时间去摸鱼&#xff0c;嘿嘿。 框架&#xff1a;react 在写表单的时候&#xff0c;我不太喜欢把验证写的很繁琐&#xff0c;这里讲介绍&#xff0c;验证表单的非常好用…

JVM实战—OOM的生产案例

1.每秒仅上百请求的系统为何会OOM(RPC超时时间设置过长导致QPS翻几倍) (1)案例背景 在这个案例中&#xff0c;一个每秒仅仅只有100请求的系统却因频繁OOM而崩溃。这个OOM问题会涉及&#xff1a;Tomcat底层工作原理、Tomcat内核参数的设置、服务请求超时时间。 (2)系统发生OOM的…

数字IC设计高频面试题

在数字IC设计领域&#xff0c;面试是评估候选人技术能力和问题解决能力的重要环节。数字IC设计的复杂性和要求在不断提高。面试官通常会提出一系列面试题&#xff0c;以考察应聘者在数字设计、验证、时钟管理、功耗优化等方面的专业知识和实践经验。 这些题目不仅涉及理论知识…

OSI模型的网络层中产生拥塞的主要原因?

&#xff08; 1 &#xff09;缓冲区容量有限&#xff1b;&#xff08; 1.5 分&#xff09; &#xff08; 2 &#xff09;传输线路的带宽有限&#xff1b;&#xff08; 1.5 分&#xff09; &#xff08; 3 &#xff09;网络结点的处理能力有限&#xff1b;&#xff08; 1 分…

用OpenCV实现UVC视频分屏

分屏 OpencvUVC代码验证后话 用OpenCV实现UVC摄像头的视频分屏。 Opencv opencv里有很多视频图像的处理功能。 UVC Usb 视频类&#xff0c;免驱动的。视频流格式有MJPG和YUY2。MJPG是RGB三色通道的。要对三通道进行分屏显示。 代码 import cv2 import numpy as np video …

备战蓝桥杯 链表详解

链表概念 上一次我们用顺序存储实现了线性表&#xff0c;这次我们用链式存储结构实现的线性表就叫链表 链表每个节点包含数据本身和下一个节点和上一个节点的地址 链表的分类 单链表 双链表 带头链表 不带头链表 循环链表等等 我们竞赛一般都用的是带头链表 双向链表的…