当前位置: 首页 > 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;}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python两大编程思想,类和对象,实例变量类变量,静态方法与实例方法和类方法,给对象动态绑定属性和函数
  • 老外说“You‘re a fat cat”是什么意思?你是只肥猫?错得离谱!柯桥学英语口语到银泰广场
  • 团结引擎发布1.2.3版本更新
  • zdpgo_cobra_req 新增解析请求体内容
  • 电脑屏幕录制指南,2024四大免费录屏软件推荐!
  • 猫头虎 分享已解决Bug || ImportError: No module named ‘django‘ 解决方案
  • 配置ssh密钥登录Redhat Linux(Putty,xshell)
  • 数据库管理-Redis
  • VS2022 C++ EasyX EGE 吃豆人升级版
  • 白骑士的Matlab教学进阶篇 2.5 Simulink
  • C语言 ——— 在杨氏矩阵中查找具体的某个数
  • IT管理:我与IT的故事1--努力是成功的序曲
  • Redis缓存配置
  • 大数据治理平台建设与应用解决方案(41页PPT)
  • JAVA解压文件到目标目录
  • 【刷算法】求1+2+3+...+n
  • export和import的用法总结
  • JAVA并发编程--1.基础概念
  • Java方法详解
  • k8s 面向应用开发者的基础命令
  • scala基础语法(二)
  • Unix命令
  • Vue.js源码(2):初探List Rendering
  • 番外篇1:在Windows环境下安装JDK
  • 仿天猫超市收藏抛物线动画工具库
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 回顾 Swift 多平台移植进度 #2
  • 前端_面试
  • 前端设计模式
  • 人脸识别最新开发经验demo
  • 提醒我喝水chrome插件开发指南
  • 用jQuery怎么做到前后端分离
  • 与 ConTeXt MkIV 官方文档的接驳
  • # .NET Framework中使用命名管道进行进程间通信
  • #在 README.md 中生成项目目录结构
  • (12)目标检测_SSD基于pytorch搭建代码
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (安卓)跳转应用市场APP详情页的方式
  • (办公)springboot配置aop处理请求.
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • .bat批处理(一):@echo off
  • .Family_物联网
  • .Mobi域名介绍
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net Web项目创建比较不错的参考文章
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中让 Task 支持带超时的异步等待
  • .NET单元测试
  • .NET关于 跳过SSL中遇到的问题
  • .net经典笔试题
  • //TODO 注释的作用