|
|
|
|
@ -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<String, Object> result = service.uploadAndParseTxtFile(file, rgtr);
|
|
|
|
|
Map<String, Object> 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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|