package org.springblade.mdm.program.service; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipFile; import org.apache.commons.compress.utils.SeekableInMemoryByteChannel; import org.springblade.core.mp.base.BizServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.utils.FileUtil; import org.springblade.mdm.program.entity.NcProgramExchange; import org.springblade.mdm.program.mapper.NcProgramExchangeMapper; import org.springblade.mdm.program.vo.DncSendBackData; import org.springblade.mdm.utils.CustomBinaryReader; import org.springblade.mdm.utils.FileExchangeUtil; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; /** * 程序交换(dnc导入/导出) * * @author yangys */ @Slf4j @Service @AllArgsConstructor public class NcProgramExchangeService extends BizServiceImpl { /** * dnc回传文件上传 * @param file 文件 * @return */ public List dncSendBackUpload(MultipartFile file) { List list ; try { String fileName = file.getOriginalFilename(); //InputStream fileInputStream = file.getInputStream(); InputStream zipFileInputStream = FileExchangeUtil.convertFileToZip(file.getInputStream()); byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream); list = parseDncZipFromByteArray(bytes); for(DncSendBackData dncSendBackData:list){ NcProgramExchange exchange=new NcProgramExchange(); exchange.setName(dncSendBackData.getProgramName()); exchange.setStatus(1);//已导入 this.save(exchange); } } catch (IOException e) { log.error("上传dnc文件失败",e); list = Collections.emptyList(); } return list; } InputStream convertFileToZip(InputStream inputStream) throws IOException { File tempFile = createTempFile(); FileOutputStream fos = new FileOutputStream(tempFile); CustomBinaryReader.read(inputStream,fos); FileInputStream dInstream = new FileInputStream(tempFile); return dInstream; } /** * 创建一个临时文件 * @return * @throws IOException */ File createTempFile() throws IOException { Path tempDir = Paths.get(System.getProperty("java.io.tmpdir")); // 在临时目录中创建文件 String tfilename = "t"+System.currentTimeMillis(); Path tempFile = Files.createTempFile(tempDir, tfilename, ".tmp"); System.out.println("创建的临时文件: " + tempFile); return tempFile.toFile(); } 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 query 查询参数 * @return */ public IPage dncSendBackPageQuery(Query query) { IPage page = this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query); return page; } } 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; } }