출처 : http://www.okjsp.pe.kr/seq/99301
해결된 문제
1. 한글 문제
2. 아헿헿 류 파일명
3. %20등 인코드 되버리는 문자열 포함 파일명
4. 대화 상자에서 한글 깨지는 문제
테스트 방법
C:/PDS에 첨부한 아헿헿1.ppt와 %B0%F8%C7%F6%C1%D61_eparinara.jpg를 추가한다.
http://localhost:8082/WebTest/FileDownload.jsp?FILENAME=아헿헿1.ppt
http://localhost:8082/WebTest/FileDownload.jsp?FILENAME=%B0%F8%C7%F6%C1%D61_eparinara.jpg
<%@ page import="java.util.*,java.io.*" contentType="text/html; charset=MS949"%><%
String queryString = request.getQueryString();
String dialogFilename = request.getParameter("FILENAME");
String fname = new String(dialogFilename.getBytes("8859_1"), "MS949");
if(queryString.contains("%")) {
fname = request.getQueryString();
String startWord = "FILENAME=";
int start = fname.indexOf(startWord) + startWord.length();
int end = fname.indexOf("&");
if(end !=-1)
fname = fname.substring(start, end);
else
fname = fname.substring(start);
}
String fpath = "현재 서버의 실제 디렉토리 경로 - 예) C:/PDS";
File file = new File(fpath+fname);
if(!file.exists()) {
out.println("<script>");
out.println("alert('요청한 파일을 찾을 수 없습니다.');");
out.println("history.back();");
out.println("</script>");
return;
}
BufferedInputStream input = null;
BufferedOutputStream output = null;
response.reset();
String strClient = request.getHeader("User-Agent");
if (strClient.indexOf("MSIE 5.5") != -1) {
response.setHeader("Content-Disposition", "filename=" + dialogFilename + ";");
} else {
response.setHeader("Content-Disposition", "attachment; filename=" + dialogFilename + ";");
response.setHeader("Content-Type", "application/octet-stream; charset=MS949");
}
response.setHeader("Content-Length", ""+ file.length());
response.setHeader("Content-Transfer-Encoding", "binary;");
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");
try {
input = new BufferedInputStream( new FileInputStream(file) );
byte buffer[] = new byte[1024];
int len = 0;
out.clear();
out.flush();
output = new BufferedOutputStream(response.getOutputStream());
while((len = input.read(buffer)) > 0 ){
output.write(buffer,0,len);
}
} catch(Exception e) {
e.printStackTrace();
} finally{
response.flushBuffer();
if(input !=null)try{input.close();}catch(Exception e){}
if(output !=null)try{output.close();}catch(Exception e){}
}
%>