출처 : 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){}
}
%>

+ Recent posts