알팅스님의 개발 스토리



한글 파일명 다운로드

한글 다운로드 시에 한글 깨짐 현상을 피하기 위해서 
브라우저 별로 서로 다른 대응이 필요로 하다.

먼저 브라우저를 분류하기 위해서는 다음과 같은 로직을 필요로 한다.


private String getBrowser(HttpServletRequestrequest) {

             String header =request.getHeader("User-Agent");

             if (header.contains("MSIE")) {

                    return "MSIE";

             } else if(header.contains("Chrome")) {

                    return "Chrome";

             } else if(header.contains("Opera")) {

                    return "Opera";

             }

             return "Firefox";

       }


request를 파라미터로 전달해주면 해당하는 브라우저를 반환해주게 된다.

반환된 브라우저별로 다시 분기를 하여 파일명을 지정하는 작업을 한다.

String header = getBrowser(request);

if (header.contains("MSIE")) {

       String docName = URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+", "%20");

       response.setHeader("Content-Disposition", "attachment;filename=" + docName + ";");

} else if (header.contains("Firefox")) {

       String docName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");

       response.setHeader("Content-Disposition", "attachment; filename=\"" + docName + "\"");

} else if (header.contains("Opera")) {

       String docName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");

       response.setHeader("Content-Disposition", "attachment; filename=\"" + docName + "\"");

} else if (header.contains("Chrome")) {

       String docName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");

       response.setHeader("Content-Disposition", "attachment; filename=\"" + docName + "\"");

}

response.setHeader("Content-Type", "application/octet-stream");

response.setContentLength((int)file.getSize());

response.setHeader("Content-Transfer-Encoding", "binary;");

response.setHeader("Pragma", "no-cache;");

response.setHeader("Expires", "-1;");



덧글

  • 써니홀릭 2014/07/12 06:48 # 삭제 답글

    오오 완죤감사!
  • 쿼리홀릭 2015/06/24 15:58 # 삭제 답글

    우와 고맙습니다
  • 쿼리홀릭 2015/06/24 15:58 # 삭제 답글

    우와 고맙습니다
  • 쿼리홀릭 2015/06/24 15:58 # 삭제 답글

    우와 고맙습니다
  • 쿼리홀릭 2015/06/24 15:58 # 삭제 답글

    우와 고맙습니다
  • rahan 2015/07/22 11:38 # 삭제 답글

    감사합니다ㅠㅜㅜ
  • rahan 2015/07/22 11:38 # 삭제 답글

    감사합니다ㅠㅜㅜ
  • rahan 2015/07/22 11:38 # 삭제 답글

    감사합니다ㅠㅜㅜ
  • rahan 2015/07/22 11:38 # 삭제 답글

    감사합니다ㅠㅜㅜ
  • 지니홀릭 2016/04/22 11:52 # 삭제 답글

    감사합니다!
  • asdifuer 2017/02/02 16:24 # 삭제 답글

    님 지젼!
  • 넘나 2017/05/19 10:17 # 삭제 답글

    감사합니다!!!!!!!!!!
  • 대박 2017/06/27 18:42 # 삭제 답글

    대박;
  • mixMaven 2018/02/07 11:37 # 삭제 답글

    정말 감사합니다!!
  • 삽질이특기 2018/11/07 16:35 # 삭제 답글

    덕분에 잘 해결했습니다.
    다만, IE Edge에서 테스트 해보니 브라우저를 크롬으로 인식하네요.
    크롬에서 파일 다운로드 하면 한글이 잘 나오는데 IE Edge에서 파일 다운로드 하면 한글이 깨져서 나옵니다.
    왜 IE Edge를 크롬으로 인식하는지 확인이 필요할것 같습니다.
  • 77722 2019/03/20 14:01 # 삭제 답글

    덕분에 문제해결했습니다. 감사합니다~
  • alstjs201 2019/07/05 14:51 # 삭제 답글

    IE11부터 브라우저 식별 문자가 Trident로 변경되었습니다.
    브라우저 분류할 때

    header.contains("MSIE") || header.contains("Trident")

    이렇게 사용하면 잘되네요
  • asdfasfdas 2020/05/20 14:17 # 삭제 답글

    와 정말 감사합니다. 1주 동안 고민하던게 이 코드로 해결이 되었습니다.
    정말 감사합니다!
댓글 입력 영역