본문 바로가기
Java/정리

[Java] 파일 다운로드할 때 파일명 지정하는 방법

by 콧등치기국수 2022. 3. 29.

웹에서 파일을 다운로드할 때 파일명을 지정해주는 코드이다. 

사용자가 요청하여 받은 request 객체에서 User-Agent 값을 얻어,

User-Agent 값에 따라 response객체에 Content-Disposition 속성을 지정하여 보낸다.

 


Content-disposition 은 HTTP Response Body에 오는 콘텐츠의 기질을 알려주는 HTTP Response 헤더의 종류로, inline과 attachment 속성을 선택할 수 있다.

1) inline 속성 : 브라우저가 인식할 수 있는 파일확장자(예를들면, html,gif,jpg,txt...)를 가진 파일은 바로 웹 페이지에서 열고, 나머지는 무조건 다운로드상자가 뜨게 한다.

2) attachment 속성 : 로컬 컴퓨터에 다운로드하여 저장한다. (대부분 브라우저에서 바로 다운로드가 된다.)

String strClient = request.getHeader("User-Agent");  // 클라이언트의 HTTP 요청헤더에서 User-Agent부분을 얻어옴
    
try {
    if (strClient.indexOf("MSIE 5.5") > -1) {      // "MSIE 5.5"라는 문자열이 있는지를 검사하여 버전이 5.5이면   
        response.setHeader("Content-Disposition", "filename=" + java.net.URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+","\\ ") + ";");
    } else {                                             
        response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "\\ ") + ";");
    }
}catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

인터넷 익스플로러 5.5 버전은 브라우저 자체버그로 인해 "attachment"를 써도 "inline"속성과 동일하게 작동한다고 한다. 그래서 if문으로 하여 inline 형식으로 해둔 것 같다.

 

.replaceAll("\\+", "\\ ") 는 파일명에 공백이 있을 경우 '+'로 표시되는 것을 막기 위해 필요하다. 


출처

1. Content-Disposition이란 : https://lannstark.tistory.com/8

2. 코드 전체적인 설명 : https://okky.kr/article/26619

3. Content-Disposition : https://candypoplatte.github.io/TIL/2018/11/15/content_disposition_header/