Translate

[Java] 파일 다운로드 시 파일명 한글 깨짐 방지 처리





최근 Java에서 파일 다운로드 할 시 한글이 깨지지 않게 작업하는데..
인터넷에 있는 대부분의 방법이 Firefox에서 한글이 깨져서 다운로드되었다.
(어떻게 파이어폭스에서 한글이 깨지지 않았는지 궁금하다)


결국 모질라사이트를 참고하여 한글, 특수문자 깨지지 않게 작업하여 다음과 같이 소스를 공유한다.
1004lucifer
다운로드 받는 파일명 깨지지 않게 하는게 포스팅의 주제라서 Spring Boot 로 간단히 예제를 만들어 봤고 GitHub 사이트에 소스를 올려놨다.
https://github.com/1004lucifer/Test_Java-download-filename
(해당소스 빌드 후 http://localhost:8080/downloadFile 접속 하여 테스트 할 수 있다.)

/**
 * @author 1004lucifer
 *
 * Test Date: 2019.10.23
 * Test Browser: IE11, Edge, Firefox(v70.0), Chrome(v77.0.3865.90)
 */
@RestController
public class DownloadKoreanFileName {

    @GetMapping("/downloadFile")
    public ResponseEntity<String> downloadFile(HttpServletRequest request) {

        String fileName = "abcd efg\t한글제목\t`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?.txt";
        String fileContent = "abcd efg\t한글내용\t`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/?";

//        IE, Edge 여부 확인
        String browser = request.getHeader("User-Agent");
        boolean isMs = browser.contains("MSIE") || browser.contains("Trident");

//        파일명 인코딩
        fileName = URLEncoder.encode(fileName).replaceAll("\\+", "%20");
//        Firefox 에서 사용할 Rfc5987
        String filenameRfc5987 = "UTF-8''" + fileName;

//        content-disposition 헤더 설정
//        Firefox에서 filename* 항목을 설정해줘야 한글이 깨지지 않는다.
//        MS에서 filename* 항목 설정 시 파일명이 정상적으로 안나오고 기본값으로 나온다.
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION,
                        "attachment; filename=\"" + fileName + "\";" +
                                (isMs ? "" : "filename*=\"" + filenameRfc5987 + "\";"))
                .body(fileContent);
    }
}


1004lucifer
특수문자와 파이어폭스 관련 아래의 이슈도 참고를 할 필요가 있다.

링크 - [Chrome] 파일 다운로드 시 파일명 물결표(~) 표시가 언더바(_)로 변경되는 이슈
링크 - [Firefox] 파일 다운로드 시 한글깨짐 원인 및 수정방법




댓글