[ADD] MinIO 파일 다운로드 및 YAML 읽기 기능 추가, 관련 Service 및 Controller 로직 구현

main
bjkim 8 months ago
parent 5b98d9564a
commit 1452b1265a

@ -45,9 +45,6 @@ public class MinioAttachmentController {
private final MinioClient minioClient; private final MinioClient minioClient;
@Value("${kubeflow.url}")
private String kubeflowBaseUrl;
@Operation(summary = "첨부파일 전체 조회") @Operation(summary = "첨부파일 전체 조회")
@GetMapping @GetMapping
public ResponseEntity<List<MinioAttachmentEntity>> getAll() { public ResponseEntity<List<MinioAttachmentEntity>> getAll() {
@ -93,12 +90,9 @@ public class MinioAttachmentController {
@Operation(summary = "파일 다운로드", description = "MinIO에서 파일을 다운로드합니다.") @Operation(summary = "파일 다운로드", description = "MinIO에서 파일을 다운로드합니다.")
@GetMapping("/download") @GetMapping("/download")
public ResponseEntity<byte[]> downloadFile(@RequestParam String objectName) { public ResponseEntity<byte[]> downloadFile(@RequestParam String objectName) {
try (InputStream is = minioClient.getObject( try {
GetObjectArgs.builder().bucket("mlpipeline").object(objectName).build() byte[] bytes = minioAttachmentService.downloadFile("mlpipeline", objectName);
)) {
byte[] bytes = is.readAllBytes();
// 파일명을 UTF-8로 URL 인코딩
String encodedFileName = URLEncoder.encode(objectName, StandardCharsets.UTF_8) String encodedFileName = URLEncoder.encode(objectName, StandardCharsets.UTF_8)
.replaceAll("\\+", "%20"); // 공백 처리 .replaceAll("\\+", "%20"); // 공백 처리
@ -106,6 +100,7 @@ public class MinioAttachmentController {
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName)
.contentType(MediaType.APPLICATION_OCTET_STREAM) .contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(bytes); .body(bytes);
} catch (Exception e) { } catch (Exception e) {
log.error("파일 다운로드 실패", e); log.error("파일 다운로드 실패", e);
return ResponseEntity.internalServerError().build(); return ResponseEntity.internalServerError().build();
@ -143,18 +138,11 @@ public class MinioAttachmentController {
@Operation(summary = "MinIO YAML 파일 읽기", description = "MinIO에서 YAML 파일을 다운로드하여 텍스트로 반환합니다.") @Operation(summary = "MinIO YAML 파일 읽기", description = "MinIO에서 YAML 파일을 다운로드하여 텍스트로 반환합니다.")
@GetMapping(value = "/readYamlText", produces = MediaType.TEXT_PLAIN_VALUE) @GetMapping(value = "/readYamlText", produces = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<String> readYamlTextFromMinio(@RequestParam String objectName) { public ResponseEntity<String> readYamlTextFromMinio(@RequestParam String objectName) {
try (InputStream is = minioClient.getObject( try {
GetObjectArgs.builder() String content = minioAttachmentService.readYamlText("mlpipeline", objectName);
.bucket("mlpipeline")
.object(objectName)
.build()
)) {
// InputStream을 문자열로 변환 (UTF-8)
String content = new String(is.readAllBytes(), StandardCharsets.UTF_8);
return ResponseEntity.ok(content); return ResponseEntity.ok(content);
} catch (Exception e) { } catch (Exception e) {
log.error("MinIO 파일 읽기 실패: " + objectName, e); log.error("MinIO 파일 읽기 실패: {}", objectName, e);
return ResponseEntity.internalServerError() return ResponseEntity.internalServerError()
.body("Error reading file: " + e.getMessage()); .body("Error reading file: " + e.getMessage());
} }

@ -1,5 +1,6 @@
package kr.re.etri.autoflow.service; package kr.re.etri.autoflow.service;
import io.minio.GetObjectArgs;
import io.minio.MinioClient; import io.minio.MinioClient;
import io.minio.PutObjectArgs; import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs; import io.minio.RemoveObjectArgs;
@ -19,6 +20,7 @@ import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException; import java.time.format.DateTimeParseException;
@ -142,7 +144,6 @@ public class MinioAttachmentService {
return minioAttachmentRepository.findAll(spec, pageable); return minioAttachmentRepository.findAll(spec, pageable);
} }
private LocalDate parseDate(String dateStr) { private LocalDate parseDate(String dateStr) {
if (dateStr == null || dateStr.isBlank()) return null; if (dateStr == null || dateStr.isBlank()) return null;
try { try {
@ -152,6 +153,28 @@ public class MinioAttachmentService {
} }
} }
public byte[] downloadFile(String bucketName, String objectName) {
try (InputStream is = minioClient.getObject(
GetObjectArgs.builder().bucket(bucketName).object(objectName).build()
)) {
return is.readAllBytes();
} catch (Exception e) {
throw new RuntimeException("MinIO 파일 다운로드 실패: " + objectName, e);
}
}
// YAML 텍스트 읽기
public String readYamlText(String bucketName, String objectName) {
try (InputStream is = minioClient.getObject(
GetObjectArgs.builder().bucket(bucketName).object(objectName).build()
)) {
return new String(is.readAllBytes(), StandardCharsets.UTF_8);
} catch (Exception e) {
throw new RuntimeException("MinIO YAML 읽기 실패: " + objectName, e);
}
}
public MinioAttachmentEntity updateFile( public MinioAttachmentEntity updateFile(
Long id, Long id,
Long projectId, // 추가 Long projectId, // 추가

Loading…
Cancel
Save