프로그래밍/Spring
첨부파일의 다운로드 한글깨짐 Controller 부분 처리
내일주말
2021. 4. 20. 17:08
● MIME 타입은 다운로드 할 수 있는 'APPLICATION_OCTET_STREAM_VALUE'으로 지정
@GetMapping(value="/download", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
● 'Content-Disposition'로 다운로드 시 저장되는 이름 설정
● 파일 이름에 대한 문자열 처리는 파일 이름이 한글인 경우 저장할 때 깨지는 문제를 막기 위함
try {
headers.add("Content-Disposition", "attachment; filename=" + new String(resourceName.getBytes("UTF-8"), "ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
● Chrome과는 다르게 IE/Edge 브라우저에서의 파일 다운로드 시 한글 깨짐 문제
● HTTP 헤더 메세지에 'User-Agent' 값을 이용(디바이스의 정보를 알 수 있음)
- 브라우저의 종류, 모바일인지 데스크톱인지 혹은 브라우저 프로그램의 종류를 구분 가능
// 수정 전
public ResponseEntity<Resource> downloadFile(String fileName) {}
// 수정 후
public ResponseEntity<Resource> downloadFile(@RequestHeader("User-Agent")String userAgent, String fileName) {}
● IE, Edge, Chrome 3가지 경우에 따라 인코딩 방식을 다르게 해 다운로드 시에 한글이 깨지지 않게 처리
- useragnet 정보 참고 : ohgyun.com/292
// IE 브라우저의 경우(IE 브라우저의 엔진 이름 = "Trident")
if(userAgent.contains("Trident")) {
downloadName = URLEncoder.encode(resourceOriginalName, "UTF-8").replaceAll("\\+", " ");
// Edge 브라우저의 경우
} else if(userAgent.contains("Edge")) {
downloadName = URLEncoder.encode(resourceOriginalName, "UTF-8");
// Chrome 브라우저의 경우
} else {
downloadName = new String(resourceName.getBytes("UTF-8"), "ISO-8859-1");
}