diff --git a/src/main/java/com/kamco/cd/training/dataset/DatasetApiController.java b/src/main/java/com/kamco/cd/training/dataset/DatasetApiController.java index c44ff3a..9db924f 100644 --- a/src/main/java/com/kamco/cd/training/dataset/DatasetApiController.java +++ b/src/main/java/com/kamco/cd/training/dataset/DatasetApiController.java @@ -237,4 +237,13 @@ public class DatasetApiController { return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource); } + + @Operation(summary = "객체별 파일 Path 조회", description = "파일 Path 조회") + @GetMapping("/files-to86") + public ResponseEntity getFileTo86( + @RequestParam UUID uuid, @RequestParam String pathType) throws Exception { + + String path = datasetService.getFilePathByUUIDPathType(uuid, pathType); + return datasetService.getFilePathByFile(path); + } } diff --git a/src/main/java/com/kamco/cd/training/dataset/service/DatasetService.java b/src/main/java/com/kamco/cd/training/dataset/service/DatasetService.java index 967647c..bfbfe3a 100644 --- a/src/main/java/com/kamco/cd/training/dataset/service/DatasetService.java +++ b/src/main/java/com/kamco/cd/training/dataset/service/DatasetService.java @@ -4,6 +4,9 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; import com.kamco.cd.training.common.enums.LearnDataType; import com.kamco.cd.training.common.exception.CustomApiException; import com.kamco.cd.training.common.service.FormatStorage; @@ -21,6 +24,7 @@ import com.kamco.cd.training.dataset.dto.DatasetObjDto.SearchReq; import com.kamco.cd.training.postgres.core.DatasetCoreService; import jakarta.validation.Valid; import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -28,13 +32,19 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.UUID; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; import org.springframework.data.domain.Page; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -474,4 +484,50 @@ public class DatasetService { private static String normalizeLinuxPath(String path) { return path.replace("\\", "/"); } + + public ResponseEntity getFilePathByFile(String remoteFilePath) { + + String host = "192.168.2.86"; + String user = "kcomu"; + String password = "Kamco2025!"; + + Session session = null; + ChannelSftp sftp = null; + + try { + JSch jsch = new JSch(); + + session = jsch.getSession(user, host, 22); + session.setPassword(password); + + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + session.connect(10_000); + + sftp = (ChannelSftp) session.openChannel("sftp"); + sftp.connect(5_000); + + // 86 서버 파일을 스트림으로 연다 + InputStream inputStream = sftp.get(normalizeLinuxPath(remoteFilePath)); + + InputStreamResource resource = + new InputStreamResource(inputStream) { + @Override + public long contentLength() { + return -1; // 알 수 없으면 -1 + } + }; + + String fileName = Paths.get(remoteFilePath.replace("\\", "/")).getFileName().toString(); + + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(resource); + + } catch (Exception e) { + throw new RuntimeException(e); + } + } }