|
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<NcProgramExchangeMapper, NcProgramExchange> {
|
|
/**
|
* dnc回传文件上传
|
* @param file 文件
|
* @return
|
*/
|
public List<DncSendBackData> dncSendBackUpload(MultipartFile file) {
|
List<DncSendBackData> 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<DncSendBackData> parseDncZipFromByteArray(byte[] zipData) throws IOException {
|
//List<DncSendBackData> datas = new ArrayList<>();
|
List<DncSendBackData> 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<String> children = new ArrayList<>();
|
prog.setChildren(children);
|
}
|
|
datas.add(prog);
|
}
|
|
|
}*/
|
return datas;
|
}
|
/**
|
* 程序下发统计分页查询
|
* @param query 查询参数
|
* @return
|
*/
|
|
public IPage<DncSendBackData> dncSendBackPageQuery(Query query) {
|
|
IPage<DncSendBackData> page = this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query);
|
|
return page;
|
|
}
|
}
|
|
|
class ZipFileDirectoryScanner {
|
|
public static List<DncSendBackData> getFilesInDirectoryRecursive(byte[] zipData, String dirPath) throws IOException {
|
List<DncSendBackData> list = new ArrayList<>();
|
|
if (!dirPath.endsWith("/")) {
|
dirPath += "/";
|
}
|
|
try (SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(zipData);
|
ZipFile zipFile = new ZipFile(channel)) {
|
|
Enumeration<ZipArchiveEntry> 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;
|
}
|
}
|