/** * BladeX Commercial License Agreement * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. *

* Use of this software is governed by the Commercial License Agreement * obtained after purchasing a license from BladeX. *

* 1. This software is for development use only under a valid license * from BladeX. *

* 2. Redistribution of this software's source code to any third party * without a commercial license is strictly prohibited. *

* 3. Licensees may copyright their own code but cannot use segments * from this software for such purposes. Copyright of this software * remains with BladeX. *

* Using this software signifies agreement to this License, and the software * must not be used for illegal purposes. *

* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is * not liable for any claims arising from secondary or illegal development. *

* Author: Chill Zhuang (bladejava@qq.com) */ package org.springblade.mdm.program.service; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; import org.apache.commons.compress.archivers.zip.ZipFile; import org.apache.commons.compress.utils.IOUtils; import org.apache.commons.compress.utils.SeekableInMemoryByteChannel; import org.flowable.engine.*; import org.springblade.core.tool.utils.FileUtil; import org.springblade.mdm.program.vo.DncSendBackData; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; /** * 工作流服务实现类 * * @author Chill */ @Slf4j @Service @AllArgsConstructor public class DncSendBackService { private final RepositoryService repositoryService; private final RuntimeService runtimeService; private final HistoryService historyService; private final ProcessEngine processEngine; /** * dnc回传文件上传 * @param file * @return */ public List dncSendBackUpload(MultipartFile file) { List list=new ArrayList<>(); try { String fileName = file.getOriginalFilename(); InputStream fileInputStream = file.getInputStream(); byte[] bytes = FileUtil.copyToByteArray(fileInputStream); list = parseDncZipFromByteArray(bytes); //TODO 解析为列表文件 DncSendBackData dt = new DncSendBackData(); dt.setId(1L); dt.setProgramName("test.nc"); dt.setProgramNo("001"); list.add(dt); } catch (IOException e) { log.error("上传dnc文件失败",e); } return list; } public static List parseDncZipFromByteArray(byte[] zipData) throws IOException { //List datas = new ArrayList<>(); List datas = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, ""); /* try (ByteArrayInputStream bis = new ByteArrayInputStream(zipData); ZipArchiveInputStream zis = new ZipArchiveInputStream(bis)) { ZipArchiveEntry entry; while ((entry = zis.getNextZipEntry()) != null) { DncSendBackData prog = new DncSendBackData(); prog.setProgramName(entry.getName()); if (!entry.isDirectory()) { System.out.println("文件名: " + entry.getName()); System.out.println("大小: " + entry.getSize()); // 读取文件内容到字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); IOUtils.copy(zis, outputStream); byte[] fileContent = outputStream.toByteArray(); // 处理文件内容... System.out.println("内容长度: " + fileContent.length); }else{ //文件夹,读内部文件,获取文件列表 System.out.println("文件夹程序:"+entry.getName()); List children = new ArrayList<>(); prog.setChildren(children); } datas.add(prog); } }*/ return datas; } /** * 入库回传文件 * @param ids * @return */ public void dncFileAccept(String ids) { } } class ZipFileDirectoryScanner { public static List getFilesInDirectoryRecursive(byte[] zipData, String dirPath) throws IOException { List list = new ArrayList<>(); if (!dirPath.endsWith("/")) { dirPath += "/"; } try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData); ZipFile zipFile = new ZipFile(channel)) { Enumeration entries = zipFile.getEntries(); while (entries.hasMoreElements()) { ZipArchiveEntry entry = entries.nextElement(); String entryName = entry.getName(); DncSendBackData d = new DncSendBackData(); d.setProgramName(entryName); if(entry.isDirectory()){ d.setHasChildren(true); } list.add(d); //if (entryName.startsWith(dirPath) && !entry.isDirectory()) { // fileList.add(entryName); //} } } return list; } }