当前位置: 首页 > news >正文

Java解析压缩包,并根据指定文件夹上传文件

方法 

  public Multimap<String, String> getCodeBucketMultimap(HttpServletRequest request)throws IOException {MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;// 基于servlet获取文件流List<MultipartFile> multipartFileList = multiRequest.getFiles("FILE");if (CollUtil.isEmpty(multipartFileList)) {return ArrayListMultimap.create();}MultipartFile multipartFile = CollUtil.getFirst(multipartFileList);String multipartFileName = multipartFile.getOriginalFilename();Preconditions.checkState(StrUtil.endWithIgnoreCase(multipartFileName, ".zip"), "非压缩包文件,需要上传Zip压缩包文件");// 返回给业务处理的数据ArrayListMultimap resultMultimap = ArrayListMultimap.create();File zipFile = FileUtil.createTempFile(IdUtil.fastSimpleUUID(), ".zip", true);File outZipPath =new File(StrUtil.join(zipFile.getParent(), File.separator, IdUtil.fastSimpleUUID()));try (InputStream instream = multipartFile.getInputStream()) {// 保存zip文件FileUtil.writeFromStream(instream, zipFile);// 解压文件ZipUtil.unzip(zipFile, outZipPath, CharsetUtil.CHARSET_GBK);List<File> fileList =FileUtil.loopFiles(outZipPath, pathname -> FileUtil.size(pathname) >= 1);ImmutableList<String> immutableList =ImmutableList.<String>builder().add("基础信息", "图纸预览", "其他附件").build();fileList.stream().filter(file -> {// 过滤掉其他的压缩文件内容String parentName = new File(file.getParent()).getName().trim();return immutableList.contains(parentName);}).forEach(file -> {String parentName = new File(file.getParent()).getName();String fileName = getCode(file.getName());String code = getCode(file);// 增加的识别逻辑String rowkey = StrUtil.format("{}@{}@{}", code, parentName, fileName);try (InputStream fileInputStream = new FileInputStream(file.getPath())) {Document fileInfoDoc = fileStorageService.storeFile(fileInputStream, fileName);String fileInfoId = DocuLib.getStr(fileInfoDoc, "id");resultMultimap.put(rowkey, fileInfoId);} catch (Exception ex) {LOGGER.error("", ex);}});} finally {FileUtil.del(zipFile);FileUtil.del(outZipPath);}return resultMultimap;}private String getCode(String code) {if (StrUtil.contains(code, "-")) {code = CollUtil.getLast(StrUtil.splitTrim(code, "-"));}return code;}private static String getCode(File file) {String code = file.getName();int index = code.indexOf(".");if (index > 0) {code = StrUtil.subBefore(code, ".", false);}if (StrUtil.contains(code, "-")) {code = CollUtil.getFirst(StrUtil.splitTrim(code, "-"));}return code;}

前端

<input type="file" id="fileInput" style="display: none;"><!-- 使用一个按钮来触发文件选择 --><button class='btn btn-outline-primary btn-sm' ng-click='ctrl.triggerFileUpload()'ng-if="''| SecurityFilter: 'materialType':'importAttachment'"type='button'><i class='bi'></i>图片及附件导入</button>
triggerFileUpload: function () {// 触发隐藏的文件选择框的点击事件var fileInput = document.getElementById('fileInput');// 移除之前的 change 事件处理器fileInput.removeEventListener('change', fileInput._changeHandler);// 为文件选择框添加新的 click 事件处理器fileInput.addEventListener('click', function () {fileInput.value = ''; // 清空文件输入框的值,以便下次选择文件});// 为文件选择框添加新的 change 事件处理器fileInput._changeHandler = function () {if (this.files.length > 0) {ctrl.uploadFile(this.files[0]);}};fileInput.addEventListener('change', fileInput._changeHandler);fileInput.click();},uploadFile: function (file) {var formData = new FormData();formData.append('FILE', file);$.ajax({type: "post",url: skybird.c_path + "/materialType/upload",data: formData,contentType: false,processData: false,dataType: "json",success: function (response) {if (!response.success) {dialog.noty(response.messages[0]);return;}dialog.noty('导入成功');}});},

后端Java接口

  @PostMapping("/upload")public CheckMessage uploadFile(HttpServletRequest request, HttpServletResponse response) {try {Multimap<String, String> codeBucketMultimap =materialTypeService.getCodeBucketMultimap(request);List<String> codeList = new ArrayList<>();codeBucketMultimap.forEach((key, value) -> {List<String> list = StrUtil.splitTrim(key, "@");codeList.add(list.get(0));});List<Document> list =DBUtils.list(materialType.collectionName,DocuLib.newDoc("materialCode", DocuLib.newDoc("$in", codeList)));Map<String, Document> dtoMap =list.stream().collect(Collectors.toMap(doc -> DocuLib.getStr(doc, "materialCode"), doc -> doc, (k, v) -> k));String time = DateUtils.getDateTime();codeBucketMultimap.asMap().forEach((key, value) -> {List<String> row = StrUtil.splitTrim(key, "@");Document dto = dtoMap.getOrDefault(row.get(0), new Document());if (ObjectUtils.isNotEmpty(dto)) {value.forEach(item -> {// 图片直接更新if (StringLib.equals(row.get(1), "基础信息") && isJpegPngJpg(row.get(2))) {dto.put("materialShow", item);}// 图纸限制1张if (StringLib.equals(row.get(1), "图纸预览") && isPdfPngJpg(row.get(2))) {List<Document> drawingPreviewList =DocuLib.getList(dto, "drawingPreviewList");if (ObjectUtils.isEmpty(drawingPreviewList)) {drawingPreviewList = new ArrayList<>();Document newDoc = DocuLib.newDoc();newDoc.put("id", item);newDoc.put("code", row.get(2));newDoc.put("uploadDate", time);drawingPreviewList.add(newDoc);dto.put("drawingPreviewList", drawingPreviewList);}}// 其他附件直接新增if (StringLib.equals(row.get(1), "其他附件")) {List<Document> otherAttachmentsList =DocuLib.getList(dto, "otherAttachmentsList");if (ObjectUtils.isEmpty(otherAttachmentsList)) {otherAttachmentsList = new ArrayList<>();}Document newDoc = DocuLib.newDoc();newDoc.put("id", item);newDoc.put("code", row.get(2));newDoc.put("uploadDate", time);otherAttachmentsList.add(newDoc);dto.put("otherAttachmentsList", otherAttachmentsList);}});}});if (CollectionUtils.isNotEmpty(list)) {List<UpdateOneModel> updateLists = Lists.newArrayList();list.stream().forEach(item -> {UpdateOneModel updateOneModel =new UpdateOneModel(Filters.eq("_id", DocuLib.getObjectId(item)),DocuLib.newDoc("$set", item));updateLists.add(updateOneModel);});DBUtils.bulkWrite(materialType.collectionName, updateLists);}return CheckMessage.newInstance();} catch (Exception e) {return CheckMessage.newInstance().setSuccess(false).addMessage("请上传Zip压缩包文件并包含基础信息,图纸预览,其他附件文件夹");}}public static boolean isPdfPngJpg(String fileName) {// 将文件名转换为小写,以便不区分大小写地进行比较String lowerCaseFileName = fileName.toLowerCase();// 检查文件扩展名if (lowerCaseFileName.endsWith(".pdf")|| lowerCaseFileName.endsWith(".png")|| lowerCaseFileName.endsWith(".jpg")) {return true;}return false;}public static boolean isJpegPngJpg(String fileName) {// 将文件名转换为小写,以便不区分大小写地进行比较String lowerCaseFileName = fileName.toLowerCase();// 检查文件扩展名if (lowerCaseFileName.endsWith(".jpeg")|| lowerCaseFileName.endsWith(".png")|| lowerCaseFileName.endsWith(".jpg")) {return true;}return false;}

相关文章:

Java解析压缩包,并根据指定文件夹上传文件

方法 public Multimap<String, String> getCodeBucketMultimap(HttpServletRequest request)throws IOException {MultipartHttpServletRequest multiRequest (MultipartHttpServletRequest) request;// 基于servlet获取文件流List<MultipartFile> multipartFile…...

【HTML】纯前台字符验证码

效果图&#xff1a; 大致思路&#xff1a; 1.在<canvas>画布里写出几个字符&#xff1b; 2.给字符一个随机的角度和颜色&#xff1b; 3.给字符上画出一些干扰线和干扰点。 <canvas width"100" height"30" id"canvasRef" click"…...

如何在 Vue.js 项目中动态设置页面标题

目录 方法 1:使用 Vue Router 的元信息(meta) 步骤 1: 配置路由元信息 步骤 2: 使用路由守卫设置标题 方法 2:在组件内设置标题 在组件挂载时设置标题 使用响应式数据动态更新标题 在开发 Vue.js 应用时,设置动态页面标题是常见需求,尤其当应用包含多个页面时,为每…...

Eval绕过限制参数限制

PHP Eval函数参数限制在16个字符 PHP代码 <?php$param $_REQUEST[param]; if (strlen($param) < 17 && stripos($param, eval) false && stripos($param, assert) false){eval($param);}?># 部署环境属于ubuntu系统 通过GET传参绕过 由于是…...

计算机网络408考研 2021

2021 计算机网络408考研2021年真题解析_哔哩哔哩_bilibili 1 1 11 1 1 11...

element table表格树形数据展示

element table表格树形数据展示 1、效果 2、代码 <el-table ref"pointMultipleTable" border class"table-box" :data"[damActiveObj]"row-key"id" :tree-props"{ children: children }" :expand-row-keys"expand…...

Ubuntu 安装 Snipaste

一、下载 Snipaste 下载Snipastehttps://zh.snipaste.com/ 二、在/opt 创建 Snipaste 目录&#xff0c;创建 bin 和 icon 子目录&#xff0c;将 Snipaste.AppImage 移动到 bin 目录 三、创建快捷键图标 1. 创建桌面图标&#xff0c;右键→允许运行 yammiemy-pc >/home/y…...

NET8环境WebAPI实现文件的压缩及下载

目录 1、文件下载的原理2、具体实现2.1 提前准备2.2 服务器端的实现2.3 请求端的实现 3、代码下载4、更多特性4.1 单独压缩文件4.2 解析4.2.1 整体解析4.2.2 单个文件解析 4.3 其他4.3.1 设置压缩级别4.3.2 密码保护4.3.3 进度反馈 5、参考资料 1、文件下载的原理 在实际应用环…...

Ubuntu 18 使用NVIDIA上的HDMI输出声音

前言 在未做修改之前&#xff0c;Settings -> Sound -> Output 里面只有 Digital Output(S/PDIF) - Built-in Audio 不显示HDMI的输出设备检查当前存在的音频设备 sudo lspci -v | grep -A7 -i "audio"输出&#xff1a; 从输出可以看出来是有两个设备的 00:1…...

C#模拟量线性变换小程序

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。本文详细介绍了如何使用C#构建一个项目,通过S7net库连接并连续读取S7-1200 PLC的数据,包括创建窗体应用、配置存储位置、安装S7net库…...

跟《经济学人》学英文:2024年08月10日这期 How AI models are getting smarter

How AI models are getting smarter Deep neural networks are learning diffusion and other tricks 原文&#xff1a; Type in a question to ChatGPT and an answer will materialise. Put a prompt into DALL-E 3 and an image will emerge. Click on TikTok’s “for y…...

Spring Web MVC入门(上)

1. Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为“spring MVC”&#xff1b; 什么是Servlet呢? Servlet…...

【c++】公差判断函数 isInTolerance

定义&#xff1a; isInTolerance 函数用来判断一个特定数值&#xff08;变量&#xff09;是否在以某个中心值为基准 &#xff0c;给定半径的范围内。这个函数包含了一个可选的参数 includeEndpoints&#xff08;默认为 true&#xff09;&#xff0c; 用于决定范围是否包含其端点…...

电脑新加的硬盘如何分区?新加硬盘分区选MBR还是GPT

最近有网友问我,电脑新加的硬盘如何分区?电脑新加的硬盘分区选MBR还是GPT要看引导模式采用uefi还是传统的legacy模式&#xff0c;如果采用的是uefi引导模式&#xff0c;分区类型对应的就是gpt分区(guid)&#xff0c;如果引导模式采用的是legacy&#xff0c;对应的分区类型为mb…...

白骑士的Matlab教学基础篇 1.3 控制流

系列目录 上一篇&#xff1a;白骑士的Matlab教学基础篇 1.2 MATLAB基础语法 控制流是编程中的核心概念&#xff0c;通过控制程序执行的顺序&#xff0c;从而实现复杂的逻辑操作。MATLAB 提供了多种控制流语句&#xff0c;包括条件语句、循环语句以及循环控制语句。掌握这些控制…...

设计模式 - 适配器模式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、适配器…...

docker部署minIO

docker部署minIO 旧版本新版本 旧版本 #-u 以root用户运行容器&#xff1b;--privilegedtrue 给予容器命令访问权限 docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z docker run -p 9001:9000 --name minio -d \-u root --privilegedtrue \-e "MINIO_ROOT_USERmin…...

「Pytorch」BF16 Mixed Precision Training

在深度学习领域&#xff0c;神经网络的训练性能瓶颈常常出现在 GPU显存的使用上。主要表现为两方面&#xff1a; 单卡上可容纳的模型和数据量有限&#xff1b;显存与计算单元之间的带宽和延迟限制了运算速度&#xff1b; 为了解决显卡瓶颈的问题&#xff0c;涌现了不同的解决…...

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图&#xff0c;而《E…...

LLMOps — 使用 BentoML 为 Llama-3 模型提供服务

使用 BentoML 和 Runpod 快速设置 LLM API 经常看到数据科学家对 LLM 的开发感兴趣&#xff0c;包括模型架构、训练技术或数据收集。然而&#xff0c;我注意到&#xff0c;很多时候&#xff0c;除了理论方面&#xff0c;许多人在以用户实际使用的方式提供这些模型时遇到了问题…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...