From 4d014f9795032d7ef02bcc8050384f7cca1738a8 Mon Sep 17 00:00:00 2001
From: yangys <y_ys79@sina.com>
Date: 星期一, 22 九月 2025 22:45:46 +0800
Subject: [PATCH] 优化文件名检查;zip文件解析加入多编码检验
---
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java | 119 ++++++++++++++++++++++++---------------
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java | 2
blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java | 1
blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java | 2
blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java | 7 ++
blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java | 3
blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java | 3 +
7 files changed, 88 insertions(+), 49 deletions(-)
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
index 8900f01..90f6a9b 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/contants/RegExpConstants.java
@@ -7,7 +7,7 @@
/**
* 绋嬪簭鏂囦欢鍚� 姝e垯
*/
- public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^([\\w\\-]+)-([0-9]+)-([0-9a-zA-Z]+)-(\\d+)-(\\d+)-?([Pp]\\d*)?(\\.*[a-zA-Z]*)$");
+ public static final Pattern PROGRAM_FILE_PATTERN = Pattern.compile("^([\\w\\-]+)-([0-9a-zA-Z]+)-([0-9a-zA-Z]+)-(\\d+)-(\\d+)-?([Pp]\\d+)?(\\.[a-zA-Z]+)?$");
//public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("[\\w\\-]+\\-\\w+\\-\\w+");
public static final Pattern PROGRAM_PACKAGE_PATTERN = Pattern.compile("([\\w\\-]+)-[0-9a-zA-Z]+-[0-9a-zA-Z]+");
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java
index 9e5d400..7424997 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/gkw/programnode/vo/ProgramNameVO.java
@@ -47,6 +47,6 @@
return StringUtils.isNotBlank(this.drawingNo)
&& StringUtils.isNotBlank(this.processNo)
&& StringUtils.isNotBlank(this.processEdition)
- && this.segmentCount > 0 && this.segmentNo > 0;
+ && this.segmentCount > 0 && this.segmentNo > 0 && this.segmentCount>=this.segmentNo;
}
}
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
index 5708e6f..8c2509c 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
@@ -37,11 +37,13 @@
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springblade.mdm.utils.ZipTextFileContentUtil;
import org.springblade.system.pojo.entity.DictBiz;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
+import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
@@ -51,6 +53,7 @@
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
/**
* DNC鍥炰紶鏂囦欢澶勭悊鏈嶅姟
@@ -59,23 +62,27 @@
*/
@Slf4j
@Service
-@AllArgsConstructor
public class DNCSendBackService extends BizServiceImpl<NcProgramExchangeMapper, NcProgramExchange> {
- private final CureFlowService cureFlowService;
- private final QinzheFgbService qinzheFbgService;
- private final NcNodeService ncNodeService;
- private final OssTemplate ossTemplate;
- private final BladeRedis bladeRedis;
- private final FlowCommonService flowCommonService;
- private final DncBackFileService dncBackFileService;
- private final MachineService machineService;
- private final ParamService paramService;
+ @Autowired
+ private CureFlowService cureFlowService;
+ @Autowired
+ private NcNodeService ncNodeService;
+ @Autowired
+ private OssTemplate ossTemplate;
+ @Autowired
+ private BladeRedis bladeRedis;
+ @Autowired
+ private FlowCommonService flowCommonService;
+ @Autowired
+ private DncBackFileService dncBackFileService;
+ @Autowired
+ private MachineService machineService;
/**
* 鍋忕鍗曟枃浠舵湯灏剧殑妯″紡锛歅+鏁板瓧
*/
private static final String P_NUMBER_PATTERN = "(?i)P\\d+";
-
+ static String[] encodings = {"UTF-8","GBK", "GB2312", "ISO-8859-1"};
private String getFileKey(){
return "dncimpfile-"+ AuthUtil.getUserId();
}
@@ -112,19 +119,47 @@
/**
* 浠庡帇缂╁寘 瑙f瀽鍥炰紶绋嬪簭鍒楄〃锛岃繖閲岃В鏋愮洰褰曞嵆鍙紝鐩綍灏辨槸绋嬪簭鍖呭悕
* @param inputStream 鍘嬬缉鍖呰緭鍏ユ祦
+ * @return 鏂囦欢鎿嶄綔寮傚父
+ */
+ List<DncSendBackData> parseProgramListFromZip(InputStream inputStream) throws IOException {
+ List<DncSendBackData> result = null;
+
+ ByteArrayInputStream byteInsStream = new ByteArrayInputStream(FileUtil.copyToByteArray(inputStream));
+ for (String encoding : encodings) {
+ try {
+ result = parseProgramListByCharset(byteInsStream,Charset.forName(encoding));
+ log.error("浣跨敤缂栫爜 {} 瑙f瀽鎴愬姛 ",encoding);
+ break;
+ } catch (Exception e) {
+ byteInsStream.reset();
+ log.error("浣跨敤缂栫爜 {} 瑙f瀽澶辫触: ",encoding,e);
+ }
+ }
+ if(result != null) {
+ return result;
+ }else{
+ return Collections.emptyList();
+ }
+ }
+ /**
+ * 浠庡帇缂╁寘 瑙f瀽鍥炰紶绋嬪簭鍒楄〃锛岃繖閲岃В鏋愮洰褰曞嵆鍙紝鐩綍灏辨槸绋嬪簭鍖呭悕
+ * @param inputStream 鍘嬬缉鍖呰緭鍏ユ祦
* @return 鍥炰紶绋嬪簭鍒楄〃
* @throws IOException 鏂囦欢鎿嶄綔寮傚父
*/
- List<DncSendBackData> parseProgramListFromZip(InputStream inputStream) throws IOException {
+ List<DncSendBackData> parseProgramListByCharset(InputStream inputStream,Charset charset) throws IOException {
List<DncSendBackData> list = new ArrayList<>();
+
Path tempZipFile = createTempFile(inputStream);
List<String> fileEntryNameList = new ArrayList<>();
List<String> dirEntryNameList = new ArrayList<>();//绋嬪簭鍖呭悕+宸ュ簭鐗堟 浣滀负鏂囦欢澶瑰悕
- try (ZipFile zipFile = new ZipFile(tempZipFile.toFile())) {
+
+ ZipEntry entry;
+ try (ZipFile zipFile = new ZipFile(tempZipFile.toFile(),charset)) {
Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
- ZipEntry entry;
+
//鑾峰彇鎵�鏈夌殑entry鍚嶇О
while (zipEntries.hasMoreElements()) {
entry = zipEntries.nextElement();
@@ -208,36 +243,7 @@
return list;
}
- /**
- * 淇绋嬪簭鍖呭悕,fanuc涓嶈瘑鍒笅鍒掔嚎锛屼笅鍙戞椂杞崲涓轰簡-锛岃繖閲岄渶瑕佺‘璁ゃ�傚簲璇ユ槸浠庡鍑鸿褰曚腑鏌ユ壘淇敼鍚庣殑鍖呭悕锛屼絾鏄幇鍦虹紪鍒剁殑娌℃湁鍜嬪姙锛�
- * @param packageNameInZip
- * @return
- */
- /*
- private String fixProgramPackageName(String packageNameInZip) {
- Matcher matcher = RegExpConstants.PROGRAM_PACKAGE_PATTERN.matcher(packageNameInZip);
- String drawingNo = null;
- if(matcher.find()) {
- drawingNo = matcher.group(1);
- }
- String processNo = null;
- if(matcher.find()) {
- processNo = matcher.group(2);
- }
-
- String processEdition = null;
- if(matcher.find()) {
- processEdition = matcher.group(3);
- }
- if(drawingNo != null && processNo != null && processEdition != null) {
- if(drawingNo.contains("_")) {
-
- }
- }
- return packageNameInZip;
- }
- */
/**
* 鍏ュ簱鍥炰紶鏂囦欢,骞跺惎鍔ㄥ浐鍖栨祦绋�
@@ -257,7 +263,6 @@
cureFlowService.startCureNew(pkgIdFileMap);
}
-
/**
* 澶勭悊鍥炰紶鏂囦欢
* @param ossFileName
@@ -268,12 +273,36 @@
private Map<Long, List<FlowProgramFile>> dealWithBackFile(String ossFileName, List<Long> acceptIdList) throws IOException{
Map<Long, List<FlowProgramFile>> pkgIdFileMap = new HashMap<>();
+ //ByteArrayInputStream byteInsStream = new ByteArrayInputStream(FileUtil.copyToByteArray(inputStream));
+ for (String encoding : encodings) {
+ try {
+ pkgIdFileMap = dealWithBackFileWithCharset(ossFileName,acceptIdList,Charset.forName(encoding));
+ log.error("浣跨敤缂栫爜 {} 瑙f瀽鎴愬姛 ",encoding);
+ break;
+ } catch (Exception e) {
+ //byteInsStream.reset();
+ log.error("浣跨敤缂栫爜 {} 瑙f瀽澶辫触: ",encoding,e);
+ }
+ }
+
+ return pkgIdFileMap;
+ }
+
+ /**
+ * 澶勭悊鍥炰紶鏂囦欢
+ * @param inputStream
+ * @param acceptIdList
+ * @return
+ * @throws IOException
+ */
+ private Map<Long, List<FlowProgramFile>> dealWithBackFileWithCharset(String ossFileName, List<Long> acceptIdList,Charset charset) throws IOException{
+ Map<Long, List<FlowProgramFile>> pkgIdFileMap = new HashMap<>();
InputStream inputStream = this.ossTemplate.statFileStream(ossFileName);
Path tempZipFile = createTempFile(inputStream);
List<String> entryNameList = new ArrayList<>();
ZipEntry entry;
- try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
+ try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile(),charset)) {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while(entries.hasMoreElements()) {
entry = entries.nextElement();
diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
index 0d46269..93b49a6 100644
--- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
+++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileContentUtil.java
@@ -104,11 +104,10 @@
byte[] buffer = new byte[2048];
try {
int actRead = inputStream.read(buffer);
-
detector.handleData(buffer, 0, actRead);
-
//璇嗗埆缁撴潫蹇呴』璋冪敤杩欎釜鏂规硶
detector.dataEnd();
+ detector.reset();
} catch (IOException e) {
throw new RuntimeException(e);
}
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java
index 863986d..828afeb 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/commons/contants/RegExpConstantsTest.java
@@ -64,6 +64,9 @@
m = RegExpConstants.PROGRAM_PACKAGE_PATTERN.matcher("CP3X296-A-B");
Assertions.assertTrue(m.find());
+ m = RegExpConstants.PROGRAM_PACKAGE_PATTERN.matcher("CS-A-1-1-1-P1.nc");
+ Assertions.assertTrue(m.find());
+
m = RegExpConstants.PROGRAM_PACKAGE_PATTERN.matcher("C_P3X296-A-B");
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java
index 65f7cc2..5598ca5 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/program/service/DNCSendBackServiceTest.java
@@ -5,6 +5,7 @@
public class DNCSendBackServiceTest {
@Test
public void testParseZip(){
+ DNCSendBackService service = new DNCSendBackService();
}
}
diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java
index 67ad0a6..34c0bf3 100644
--- a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java
+++ b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/ProgramFileNameParserTest.java
@@ -36,4 +36,11 @@
Assertions.assertEquals("9",vo.getProcessNo());
Assertions.assertEquals("B",vo.getProcessEdition());
}
+ @Test
+ public void testIssValidFilename() {
+ ProgramNameVO vo = ProgramFileNameParser.parseProgramName("CS-A-1-1-1-P1.nc");
+
+ Assertions.assertTrue(vo.isValidFilename());
+ }
+
}
--
Gitblit v1.9.3