웹에서 파일을 다운로드할 때 파일명을 지정해주는 코드이다.
사용자가 요청하여 받은 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/
'Java > 정리' 카테고리의 다른 글
[java] tomcat 버전 오류 (0) | 2022.04.05 |
---|---|
[Java] jsp에서 다운로드 로직 구현 시 주의할 점 (0) | 2022.03.29 |
[eclipse] A java Runtime Environment(JRE) or Java Development Kit(JDK) must be available in order to run Eclipse. (0) | 2022.01.09 |
[Java] 파일 출력 방법들 (0) | 2021.12.23 |
[Java] 매개변수 전달방식(Call-by-value, Call-by-reference) (0) | 2021.12.22 |