업로드 UTF-8 -> EUC-KR

다운로드 EUC-KR -> UTF-8
TODO 참조
main
박성영 3 weeks ago
parent c8a14271ff
commit d190e4dcf6

@ -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);
}
}
}
}

Loading…
Cancel
Save