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;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值