Pārlūkot izejas kodu

fix openDir bugs

allen 2 nedēļas atpakaļ
vecāks
revīzija
5f6c401428

+ 1 - 0
taais-modules/taais-biz/src/main/java/com/taais/biz/constant/BizConstant.java

@@ -58,6 +58,7 @@ public class BizConstant {
     }
 
     public static final String TASK_FOLDER_PATH_HEAD = "/task/";
+    public static final String TASK_FOLDER_PATH_HEAD2 = "/task";
 
     public static final String TASK_FOLDER_PATH_MID_TRAIN = "/train/";
     public static final String TASK_FOLDER_PATH_MID_TEST = "/test/";

+ 0 - 5
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/PublicController.java

@@ -1,6 +1,5 @@
 package com.taais.biz.controller;
 
-import com.alibaba.fastjson2.JSON;
 import com.taais.biz.constant.BizConstant;
 import com.taais.biz.domain.DataAugmentation;
 import com.taais.biz.domain.TaskTrackResultBo;
@@ -14,8 +13,6 @@ import com.taais.biz.service.impl.TargetIdentificationSubtaskDetailsServiceImpl;
 import com.taais.biz.service.service.impl.ObjectMatchServiceImpl;
 import com.taais.common.core.config.TaaisConfig;
 import com.taais.common.core.core.domain.CommonResult;
-import com.taais.common.log.annotation.Log;
-import com.taais.common.log.enums.BusinessType;
 import com.taais.common.web.core.BaseController;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
@@ -23,7 +20,6 @@ import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.InputStreamResource;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
@@ -36,7 +32,6 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.Date;
 
 /**

+ 36 - 54
taais-modules/taais-biz/src/main/java/com/taais/biz/controller/TargetIdentificationSubtaskDetailsController.java

@@ -289,70 +289,52 @@ public class TargetIdentificationSubtaskDetailsController extends BaseController
     public CommonResult<Void> openDir(String directory, String type) throws IOException {
         String path =  profile + "/task" + directory;
         log.info("check dir: {}", path);
-        if("1".equals(type)){
+        if (GraphicsEnvironment.isHeadless()) {
+            log.info("Headless 模式,改用命令行方式");
+            openFolderViaCommandLine(path);
+        } else {
+            log.info("使用Desktop 模式");
             try {
                 Desktop desktop = Desktop.getDesktop();
-                File dir = new File(path);
-                if (dir.exists()) {
-                    desktop.open(dir);
+                if (desktop.isSupported(Desktop.Action.OPEN)) {
+                    desktop.open(new File(path));
                 } else {
-                    System.out.println("文件夹不存在: " + path);
+                    log.info("Desktop.OPEN 不支持,改用命令行方式");
+                    openFolderViaCommandLine(path);
                 }
-            } catch (IOException e) {
-                e.printStackTrace();
+            } catch (Exception e) {
+                log.info("Desktop 失败:" + e.getMessage());
+                openFolderViaCommandLine(path);
             }
         }
+        return CommonResult.success();
+    }
 
-        if("2".equals(type)){
-            try {
-                // 对于Ubuntu/GNOME桌面环境
-                Process process = Runtime.getRuntime().exec(new String[]{"xdg-open", path});
-
-                // 或者使用nautilus(文件管理器)
-                // Process process = Runtime.getRuntime().exec(new String[]{"nautilus", path});
-
-                int exitCode = process.waitFor();
-                if (exitCode != 0) {
-                    System.out.println("打开文件夹失败,退出码: " + exitCode);
-                }
-            } catch (IOException | InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
-
-        if("21".equals(type)){
-            try {
-
-                // 或者使用nautilus(文件管理器)
-                Process process = Runtime.getRuntime().exec(new String[]{"nautilus", path});
-
-                int exitCode = process.waitFor();
-                if (exitCode != 0) {
-                    System.out.println("打开文件夹失败,退出码: " + exitCode);
-                }
-            } catch (IOException | InterruptedException e) {
-                e.printStackTrace();
-            }
+    private void openFolderViaCommandLine(String path) {
+        String os = System.getProperty("os.name").toLowerCase();
+        log.info("Headless 模式,改用命令行方式,OS:" + os);
+        String command;
+
+        if (os.contains("linux")) {
+            command = "xdg-open";
+        } else if (os.contains("win")) {
+            command = "explorer";
+        } else if (os.contains("mac")) {
+            command = "open";
+        } else {
+            throw new UnsupportedOperationException("不支持的操作系统: " + os);
         }
 
-        if("3".equals(type)){
-            try {
-                ProcessBuilder pb = new ProcessBuilder("xdg-open", path);
-                // 或者使用: ProcessBuilder pb = new ProcessBuilder("nautilus", path);
-                pb.start();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        if("4".equals(type)){
-            try {
-                ProcessBuilder pb = new ProcessBuilder("nautilus", path);
-                pb.start();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
+        try {
+            log.info("process start");
+            ProcessBuilder pb = new ProcessBuilder(command, path);
+            pb.redirectOutput(ProcessBuilder.Redirect.DISCARD);
+            pb.redirectError(ProcessBuilder.Redirect.DISCARD);
+            Process process = pb.start();  // 不调用 waitFor(),避免阻塞
+            log.info("process launched (non-blocking)");
+        } catch (IOException e) {
+            log.error("Process error", e);
         }
-        return CommonResult.success();
     }
 
     @GetMapping("/getImgList")

+ 2 - 2
taais-modules/taais-biz/src/main/java/com/taais/biz/domain/vo/TargetIdentificationSubtaskDetailsVo.java

@@ -66,7 +66,7 @@ private static final long serialVersionUID = 1L;
 
     // 获取预处理数据路径绝对路径
     public String getAbsolutePreprocessPath(){
-        return TaaisConfig.getProfile() + BizConstant.TASK_FOLDER_PATH_HEAD + preprocessPath;
+        return TaaisConfig.getProfile() + BizConstant.TASK_FOLDER_PATH_HEAD2 + preprocessPath;
     }
 
     /** 结果数据路径 */
@@ -75,7 +75,7 @@ private static final long serialVersionUID = 1L;
 
     // 获取结果数据路径绝对路径
     public String getAbsoluteResultPath(){
-        return TaaisConfig.getProfile() + BizConstant.TASK_FOLDER_PATH_HEAD + resultPath;
+        return TaaisConfig.getProfile() + BizConstant.TASK_FOLDER_PATH_HEAD2 + resultPath;
     }
 
     /** 序号 */