● 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");
}

 

+ Recent posts