Просмотр исходного кода

fix(backend): 修复 parse 读取文件路径重复拼接 uploadBaseDir

saveUploadFile 返回含 uploadBaseDir 前缀的绝对路径并存入 draft.fileUrl,
parse/parse-preview 读取时又拼一次 uploadBaseDir,形成
/data/cfc-uploads/data/cfc-uploads/uploads/... 的重复路径导致文件找不到。
新增 resolveUploadFilePath 兼容绝对/相对两种历史格式,两处读取统一走该方法。
asus 1 месяц назад
Родитель
Сommit
f909469acc

+ 22 - 2
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java

@@ -534,7 +534,7 @@ public class HealthReportController {
 
         String fileUrl = draft.getFileUrl();
         String originalFilename = draft.getOriginalFilename();
-        String absolutePath = uploadBaseDir + "/" + fileUrl;
+        String absolutePath = resolveUploadFilePath(fileUrl);
 
         try {
             java.io.File localFile = new java.io.File(absolutePath);
@@ -717,7 +717,7 @@ public class HealthReportController {
 
             // 保存文件到磁盘(LangGraph 和本地解析共用)
             String fileUrl = saveUploadFile(file, userId);
-            String absolutePath = uploadBaseDir + "/" + fileUrl;
+            String absolutePath = resolveUploadFilePath(fileUrl);
 
             // 尝试 LangGraph 远程解析
             try {
@@ -1751,6 +1751,26 @@ public class HealthReportController {
         log.info(summary);
     }
 
+    /**
+     * 解析草稿文件在服务器上的绝对路径。
+     * 兼容两种存储格式:
+     * - 当前格式:saveUploadFile 返回的绝对路径(已含 uploadBaseDir 前缀)
+     * - 历史格式:相对路径(如 uploads/health-reports/...)
+     * 修复:parse/parse-preview 曾对绝对路径再次拼接 uploadBaseDir 导致文件找不到。
+     */
+    private String resolveUploadFilePath(String fileUrl) {
+        if (fileUrl == null || fileUrl.isEmpty()) {
+            return null;
+        }
+        String normalized = fileUrl.replace("\\", "/");
+        if (normalized.startsWith("/") || normalized.matches("^[A-Za-z]:.*")) {
+            // 已是绝对路径,直接使用
+            return normalized;
+        }
+        // 相对路径,拼接上传根目录
+        return uploadBaseDir + "/" + normalized;
+    }
+
     /**
      * 保存上传文件到本地存储
      */