附件上传唯一性校验

article/2025/7/15 20:35:25

1. 

    @Overridepublic String uploadFile(MultipartFile file, String id, String funNo, String ctType) {//TODO 附件重复判断// 计算文件哈希值// 将MultipartFile转换为临时File对象String fileHash = "";try {File tempFile = convertMultipartFileToFile(file);// 计算文件哈希值fileHash = calculateFileHash(tempFile);} catch (Exception e) {e.printStackTrace();}TbFile checkFileHash = new TbFile();checkFileHash.setFileHash(fileHash);List<TbFile> checkFileHashList = tbFileMapper.selectTbFileList(checkFileHash);if(checkFileHashList.size()>=1){throw new com.ruoyi.common.exception.CustomException("文件已存在,请勿重复上传!");}// 生成新的唯一文件名并保存文件String uniqueFileName = generateUniqueFileName(file.getName());SysUser user = SecurityUtils.getLoginUser().getUser();// 判断附件类型String extension = "." + FileUploadUtils.getExtension(file);if (!ALLOW_EXCEL_FORM.contains(extension.toLowerCase())) {throw new CustomException("请上传正确的文件类型");}UploadConfig uploadConfig = ApplicationContextUtils.getBean(UploadConfig.class);String shortPath = uploadConfig.getRootUploadPath() + "image/";String[] split = file.getOriginalFilename().split("\\.");String primaryKey = split[0];String wjtype = split[1];String filePath = shortPath + primaryKey + extension;// 临时文件File localTempFile = new File(shortPath + primaryKey + extension);if (!localTempFile.getParentFile().exists()) {localTempFile.getParentFile().mkdir();}if (!localTempFile.exists()) {Try.run(localTempFile::createNewFile).onFailure(e -> log.error("新增文件失败"));}Try.run(() -> file.transferTo(localTempFile)).onFailure(e -> log.error("上传失败"));if (!localTempFile.exists()) {throw new CustomException("上传失败,服务器环境创建文件服务存储的文件夹失败,请联系管理员处理!");}//单附件  先删除,在上传if (funNo.equals("yth_1000") || funNo.equals("yth_1001") || funNo.equals("yth_1003") || funNo.equals("yth_1005") || funNo.equals("yth yth_1006")) {TbFile checkFile = new TbFile();checkFile.setCtIdP(id);checkFile.setCtFunNo(funNo);checkFile.setCtType(ctType);List<TbFile> tbFilesList = tbFileMapper.selectTbFileList(checkFile);for (TbFile tbFile : tbFilesList) {int i = tbFileMapper.deleteTbFileByCtId(tbFile.getCtId());if (i < 1) {throw new CustomException("附件替换失败");}}}TbFile tbFile = new TbFile();tbFile.setCtFileName(primaryKey + "." + wjtype);tbFile.setCtIdP(id);tbFile.setCtFileType(primaryKey);tbFile.setCtFunNo(funNo);tbFile.setCtFileUel(filePath);tbFile.setCtType(ctType);tbFile.setBy5(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getNowDate()));//附件上传时间tbFile.setBy4(String.valueOf(user.getUserId()));//上传附件的用户idtodo  tbFile.setFileHash(fileHash);int i = tbFileMapper.insertTbFile(tbFile);if (i != 1) {throw new CustomException(FunNoConstants.AJK_AJQQ);}return "文件上传成功";}

2. 

    /*** 计算文件的MD5哈希值*/private String calculateFileHash(File file) throws Exception {MessageDigest digest = MessageDigest.getInstance("MD5");try (FileInputStream fis = new FileInputStream(file)) {byte[] buffer = new byte[8192];int read;while ((read = fis.read(buffer)) != -1) {digest.update(buffer, 0, read);}}byte[] hashBytes = digest.digest();StringBuilder sb = new StringBuilder();for (byte b : hashBytes) {sb.append(String.format("%02x", b));}return sb.toString();}/*** 生成唯一文件名*/private String generateUniqueFileName(String originalFileName) {// 实际应用中可能需要更复杂的逻辑// 这里简单地使用时间戳String extension = "";int dotIndex = originalFileName.lastIndexOf('.');if (dotIndex > 0) {extension = originalFileName.substring(dotIndex);}return System.currentTimeMillis() + extension;}/*** 将MultipartFile转换为File对象*/private File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {File tempFile = File.createTempFile("temp-", "-" + multipartFile.getOriginalFilename());try (FileOutputStream fos = new FileOutputStream(tempFile)) {fos.write(multipartFile.getBytes());}// 设置JVM退出时删除临时文件tempFile.deleteOnExit();return tempFile;}

3.数据库

4.测试


http://www.hkcw.cn/article/UkqJNFkYgB.shtml

相关文章

正点原子AU15开发板!板载40G QSFP、PCIe3.0x8和FMC LPC等接口,性能强悍!

正点原子AU15开发板&#xff01;板载40G QSFP、PCIe3.0x8和FMC LPC等接口&#xff0c;性能强悍&#xff01; 正点原子AU15开发板搭载Xilinx Artix UltraScale 系列FPGA&#xff0c;核心板主控芯片的型号是XCAU15P-FFVB676-2I。开发板由核心板&#xff0b;底板组成&#xff0c;外…

Attention-> flashAttention材料参考

1、 一文看懂 Attention&#xff08;本质原理3大优点5大类型&#xff09;_attention结构-CSDN博客2​​​​​​​2https://blog.csdn.net/haima1998/article/details/107845549 2、 一文看懂 NLP 里的模型框架 Encoder-Decoder 和 Seq2Seq (easyai.tech) 3、 详解深度学习…

MySQL高可用集群

https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-innodb-cluster.html 1 什么是MySQL高可用集群 MySQL高可用集群&#xff1a;MySQL InnoDB ClusterInnoDB Cluster是MySQL官方实现高可用读写分离的架构方案&#xff0c;包含以下组件 MySQL Group Replication&#xff1a;简…

山洪灾害声光电监测预警解决方案

一、方案背景 我国是一个多山的国家&#xff0c;山丘区面积约占国土面积的三分之二。每年汛期&#xff0c;受暴雨等因素影响&#xff0c;极易引发山洪和泥石流。山洪、泥石流地质灾害具有突发性、流速快、流量大、物质容量大和破坏力强等特点&#xff0c;一旦发生&#xff0c;将…

2025年最新工程项目管理系统应该具备哪些模块?

随着数字化转型浪潮席卷工程行业&#xff0c;工程项目管理系统的作用愈发凸显。2025年&#xff0c;工程项目管理系统的核心目标不仅是提升项目效率&#xff0c;更在于通过智能化、集成化技术实现全生命周期的精细化管理。基于行业趋势和企业实际需求&#xff0c;结合金众诚工程…

unity入门:同一文本不同颜色显示

unity入门&#xff1a;同一文本不同颜色显示 同一文本不同颜色显示#RRGGBBAA&#xff08;带透明度&#xff09;用法 同一文本不同颜色显示 在Unity中&#xff0c;如果想让文本中的某一部分显示不同的颜色&#xff0c;可以使用富文本(Rich Text)标记&#xff0c;在字符串中插入…

128、STM32H723ZGT6实现串口IAP

Bootloader程序通过串口接收*.bin文件数据&#xff0c;写入到内部flash区域&#xff0c;然后跳转APP应用程序 flash读写数据参考我的博客&#xff1a;127、stm32h743XI内部flash 注意&#xff1a;H723系列flash必须32字节写入&#xff0c;并且擦除时别重启|断电&#xff0c;不然…

【Netty系列】Reactor 模式 2

目录 流程图说明 关键流程 以下是 Reactor 模式流程图&#xff0c;结合 Netty 的主从多线程模型&#xff0c;帮助你直观理解事件驱动和线程分工&#xff1a; 流程图说明 Clients&#xff08;客户端&#xff09; 多个客户端&#xff08;Client 1~N&#xff09;向服务端发起连…

接口自动化测试用例的编写方法

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 phpunit 接口自动化测试系列 Post接口自动化测试用例 Post方式的接口是上传接口&#xff0c;需要对接口头部进行封装&#xff0c;所以没有办法在浏览器下直接调…

2025030给荣品PRO-RK3566开发板单独升级Android13的boot.img

./build.sh init ./build.sh -K ./build.sh kernel 【导入配置文件】 Z:\Android13.0\rockdev\Image-rk3566_t\config.cfg 【更新的内核】 Z:\Android13.0\rockdev\Image-rk3566_t\boot.img 【导入分区表&#xff0c;使用原始的config.cfg会出错的^_】 Z:\Android13.0\rockdev\…

伊拉克军方打死6名“伊斯兰国”武装分子

△伊拉克联合行动指挥部发布视频截图当地时间5月30日,伊拉克联合行动指挥部下属安全媒体中心发表声明称,29日晚至30日早间,伊军方出动战机对位于该国北部萨拉赫丁省沙伊谷地的极端组织“伊斯兰国”武装分子藏匿点发动空袭,打死了6名武装分子,并摧毁其藏匿点。(总台记者 米…

Python打卡训练营Day40

DAY 40 训练和测试的规范写法 知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#x…

Haproxy搭建web群集

目录 一&#xff1a;Haproxy 1.Haproxy常见的调度算法 二&#xff1a;环境案例 1.配置web主机 2.配置haproxy主机 3.Haproxy日志 一&#xff1a;Haproxy Haproxy 是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多,如 LVS 和 Nginx。相比较而言&#…

ansible自动化playbook简单实践

方法一&#xff1a;部分使用ansible 基于现有的nginx配置文件&#xff0c;定制部署nginx软件&#xff0c;将我们的知识进行整合 定制要求&#xff1a; 启动用户&#xff1a;nginx-test&#xff0c;uid是82&#xff0c;系统用户&#xff0c;不能登录 启动端口82 web项目根目录/…

一句话开发Chrome摸鱼插件

本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴&#xfeff;。 CodeBuddy 一、CodeBuddy新功能特色 Craft智能体&#xff1a;自然语言驱动的全栈开发引擎Craft开发智能体的核心突破在于实现需求理解-任务拆解-代码生成的…

2024PLM系统实施案例:天水天轲零部件

一、行业背景与中小企业的现实挑战 汽车零部件行业竞争激烈&#xff0c;中小企业普遍面临研发周期长、数据管理混乱、供应链协同效率低等问题。天水天轲零部件作为一家年产值约700万元的小型制造企业&#xff0c;其痛点具有行业典型性&#xff1a; 研发数据分散&#xff1a…

Linux(8)——进程(控制篇——上)

目录 ​编辑 一、进程创建 1.fork函数的回顾 2.fork的返回值 3.写时拷贝 4.fork的常规用法 5.fork调用失败的原因 二、进程终止 1.进程退出的场景 2.进程常见的退出方法 3.进程退出码 4.进程正常退出 1&#xff09;_exit函数 2&#xff09;exit函数 3&#xff…

万亿小吃市场背后:冷链配送如何破解连锁门店“到店难题”?

在餐饮行业连锁化率突破23%、小吃快餐品类占据连锁门店半壁江山的今天&#xff0c;冷链配送已成为支撑品牌扩张的隐形基础设施。从田间到餐桌&#xff0c;从中央厨房到终端门店&#xff0c;冷链物流的每一次温度波动都直接关联着消费者的味蕾体验与品牌口碑。本文将解析冷链配送…

基于Java+MySQL 实现(Web)企业信息展示系统

基于java web企业信息展示系统设计和实现 摘要 随着企业经营环境的不断变化和竞争的口益加剧&#xff0c;企业经营管理水平的提高已成当务之急&#xff0c;人力资源管理作为企业管理中最重要的部分&#xff0c;其水平的高低已成企业发展的关键因素。随着计算机技术特别是互联…

11.2 java语言执行浅析3美团面试追魂七连问

美团面试追魂七连问&#xff1a;关于Object o New Object() ,1请解释一下对象的创建过程(半初始化) 2,加问DCL要不要volatile 问题(指令重排) 3.对象在内存中的存储布局(对象与数组的存储不同),4.对象头具体包括什么.5.对象怎么定位.6.对象怎么分配(栈-线程本地-Eden-Old)7.在…