diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/controller/CarFfnlgTrgtController.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/controller/CarFfnlgTrgtController.java index ecf76f5..3978f2b 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/controller/CarFfnlgTrgtController.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/controller/CarFfnlgTrgtController.java @@ -21,7 +21,11 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -107,15 +111,20 @@ public class CarFfnlgTrgtController { // 서비스에서 EUC-KR 텍스트 콘텐츠 생성 byte[] fileBytes = service.generateEucKrDownloadBytes(paramVO); + // EUC-KR 바이트를 UTF-8 바이트로 변환 (다운로드 시에만) + String content = new String(fileBytes, "EUC-KR"); + // TODO : ECU-KR -> UTF-8 변환 + byte[] utfFileBytes = content.getBytes(StandardCharsets.UTF_8); + String fileName = URLEncoder.encode("유효기간경과_과태료부과대상_리스트.txt", "UTF-8"); - // 응답 헤더 설정 (텍스트 파일, EUC-KR 인코딩) - response.setContentType("text/plain; charset=EUC-KR"); + // 응답 헤더 설정 (텍스트 파일, UTF-8 인코딩) + response.setContentType("text/plain; charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); - response.setContentLength(fileBytes.length); + response.setContentLength(utfFileBytes.length); - // 바이트 스트림으로 전송 (본문은 EUC-KR 바이트) - response.getOutputStream().write(fileBytes); + // UTF-8 바이트 스트림으로 전송 + response.getOutputStream().write(utfFileBytes); response.getOutputStream().flush(); } catch (Exception e) { log.error("목록 다운로드 중 오류", e); @@ -163,9 +172,12 @@ public class CarFfnlgTrgtController { if (rgtr == null || rgtr.isEmpty()) { return ApiResponseUtil.error("로그인 정보가 없습니다."); } - + + // TODO : UTF-8 파일을 EUC-KR로 변환 (시스템은 EUC-KR 기준으로 처리) + MultipartFile convertedFile = convertUtf8ToEucKr(file); + // 파일 업로드 및 파싱 (한 건이라도 실패 시 전체 롤백) - Map result = service.uploadAndParseTxtFile(file, rgtr); + Map result = service.uploadAndParseTxtFile(convertedFile, rgtr); boolean success = (boolean) result.get("success"); int successCount = (int) result.get("successCount"); @@ -391,4 +403,90 @@ public class CarFfnlgTrgtController { return ApiResponseUtil.error("삭제 중 오류가 발생했습니다: " + e.getMessage()); } } + + /** + * UTF-8 인코딩된 MultipartFile을 EUC-KR 인코딩으로 변환 + * + * @param utf8File UTF-8 인코딩된 원본 파일 + * @return EUC-KR 인코딩으로 변환된 파일 + * @throws IOException 파일 읽기/변환 중 오류 발생 시 + */ + private MultipartFile convertUtf8ToEucKr(MultipartFile utf8File) throws IOException { + // UTF-8로 파일 내용 읽기 + String content = new String(utf8File.getBytes(), StandardCharsets.UTF_8); + + // EUC-KR 바이트로 변환 + byte[] eucKrBytes = content.getBytes("EUC-KR"); + String eucKrContent = new String(eucKrBytes, "EUC-KR"); + + log.info("파일 인코딩 변환 - UTF-8({} bytes) → EUC-KR({} bytes)", + utf8File.getSize(), eucKrBytes.length); + + // EUC-KR 바이트로 변환된 새로운 MultipartFile 반환 + return new EucKrMultipartFile( + utf8File.getName(), + utf8File.getOriginalFilename(), + utf8File.getContentType(), + eucKrBytes + ); + } + + /** + * EUC-KR 인코딩 변환을 위한 커스텀 MultipartFile 구현체 + */ + private static class EucKrMultipartFile implements MultipartFile { + private final String name; + private final String originalFilename; + private final String contentType; + private final byte[] bytes; + + public EucKrMultipartFile(String name, String originalFilename, String contentType, byte[] bytes) { + this.name = name; + this.originalFilename = originalFilename; + this.contentType = contentType; + this.bytes = bytes; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getOriginalFilename() { + return originalFilename; + } + + @Override + public String getContentType() { + return contentType; + } + + @Override + public boolean isEmpty() { + return bytes == null || bytes.length == 0; + } + + @Override + public long getSize() { + return bytes.length; + } + + @Override + public byte[] getBytes() { + return bytes; + } + + @Override + public InputStream getInputStream() { + return new ByteArrayInputStream(bytes); + } + + @Override + public void transferTo(java.io.File dest) throws IOException, IllegalStateException { + try (java.io.FileOutputStream fos = new java.io.FileOutputStream(dest)) { + fos.write(bytes); + } + } + } }