diff --git a/exam-module-judgement/exam-module-judgement-biz/pom.xml b/exam-module-judgement/exam-module-judgement-biz/pom.xml
index 533cdb0c..fa618c20 100644
--- a/exam-module-judgement/exam-module-judgement-biz/pom.xml
+++ b/exam-module-judgement/exam-module-judgement-biz/pom.xml
@@ -43,7 +43,11 @@
Saxon-HE
12.5
-
+
+ org.apache.commons
+ commons-compress
+ 1.26.0
+
pc.exam.gg
diff --git a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/service/auto_tools/AutoToolsServiceImpl.java b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/service/auto_tools/AutoToolsServiceImpl.java
index 9074cada..7c757f93 100644
--- a/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/service/auto_tools/AutoToolsServiceImpl.java
+++ b/exam-module-judgement/exam-module-judgement-biz/src/main/java/pc/exam/pp/module/judgement/service/auto_tools/AutoToolsServiceImpl.java
@@ -1,6 +1,8 @@
package pc.exam.pp.module.judgement.service.auto_tools;
import jakarta.annotation.Resource;
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipFile;
import org.springframework.stereotype.Service;
import pc.exam.pp.framework.common.exception.ErrorCode;
import pc.exam.pp.framework.common.pojo.CommonResult;
@@ -18,9 +20,8 @@ import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
+import java.util.Enumeration;
import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
@Service
public class AutoToolsServiceImpl implements AutoToolsService{
@@ -74,21 +75,18 @@ public class AutoToolsServiceImpl implements AutoToolsService{
return null;
}
- // 提取 zip 文件名(无扩展)
String fileNameNoExt = zipFile.getName().replaceAll("(?i)\\.zip$", "");
- // 自动拼接系统适配路径
File extractDir = new File(zipFile.getParentFile(), fileNameNoExt);
+ if (!extractDir.exists()) extractDir.mkdirs();
- if (!extractDir.exists()) {
- extractDir.mkdirs();
- }
-
- try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
- ZipEntry entry;
- while ((entry = zis.getNextEntry()) != null) {
+ // 指定编码(GBK 用于支持中文文件名,UTF-8 用于通用 ZIP)
+ try (ZipFile zf = new ZipFile(zipFile, "GBK")) {
+ Enumeration entries = zf.getEntries();
+ while (entries.hasMoreElements()) {
+ ZipArchiveEntry entry = entries.nextElement();
File outFile = new File(extractDir, entry.getName());
- // 防止 Zip 路径穿越攻击
+ // 防止 Zip 穿越攻击
if (!outFile.getCanonicalPath().startsWith(extractDir.getCanonicalPath())) {
throw new IOException("非法路径: " + entry.getName());
}
@@ -99,21 +97,22 @@ public class AutoToolsServiceImpl implements AutoToolsService{
File parent = outFile.getParentFile();
if (!parent.exists()) parent.mkdirs();
- try (FileOutputStream fos = new FileOutputStream(outFile)) {
+ try (InputStream is = zf.getInputStream(entry);
+ OutputStream os = new FileOutputStream(outFile)) {
+
byte[] buffer = new byte[4096];
int len;
- while ((len = zis.read(buffer)) > 0) {
- fos.write(buffer, 0, len);
+ while ((len = is.read(buffer)) > 0) {
+ os.write(buffer, 0, len);
}
}
}
- zis.closeEntry();
}
System.out.println("✅ 解压完成,目录:" + extractDir.getAbsolutePath());
return extractDir.getAbsolutePath();
} catch (IOException e) {
- System.err.println("❌ 解压出错: " + e.getMessage());
+ System.err.println("❌ 解压失败: " + e.getMessage());
return null;
}
}
@@ -176,23 +175,17 @@ public class AutoToolsServiceImpl implements AutoToolsService{
if (qu_file_list == null) continue;
// --- 7.2、通过文件名称进行判分
for (File file_one : qu_file_list) {
- // 判断名称 类似于 C语言程序设计。
- if (file_one.getName().split("\\.")[0].equals(examQuestion.getCourseName()+examQuestion.getSubjectName())) {
+ // 判断名称 类似于 C语言程序设计。 课程+题型
+ if (file_one.getName().split("\\.")[0].equals(examQuestion.getSubjectName()+examQuestion.getCourseName())) {
double c_score = judgementService.ProgrammingC(15.0, file.getPath(), file_one.getName(), examQuestion);
score += c_score;
break;
}
// wps 类型存在多级文文件夹,需要个性化设置
- if (file_one.getName().equals("结果")) {
- // 进入到学生作答得文件,直接判断文件是否存在
- File wps_file = new File(file_one.getPath());
- File[] wps_file_list = wps_file.listFiles();
- if (wps_file_list == null) break;
- if (wps_file_list[0].getName().equals("结果.docx")) {
- // 开始调用wps_word判分
- double wps_word_score = judgementWpsWordService.judgementWpsWord(15.0, wps_file_list[0].getPath(), examQuestion);
- score += wps_word_score;
- }
+ if (file_one.getName().split("\\.")[0].equals("文档")) {
+ double wps_word_score = judgementWpsWordService.judgementWpsWord(15.0, file_one.getPath(), examQuestion);
+ score += wps_word_score;
+ break;
}
}
}