브라우저에 출력되는 것을 막고 다운로드 창이 열리도록 하는 예제
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownloadServlet extends HttpServlet {
static final long serialVersionUID = 100L;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException ,IOException {
/*브라우저에 문자가 아닌 바이트 데이터를 전송하려고 하므로
*현재 서블릿에서 charset을 지정해서는 안된다.
*그러므로 사용되는 파일 이름은 다음처럼 인코딩해야 한다.
*헤더에 파일명을 삽입할 때는 영문으로 인코딩해야 한다.*/
String myFile = "문제1.txt";
myFile = new String(myFile.getBytes(), "8859_1");//영문 인코딩
//String myFile = "문제1.txt";//한글일 경우, http 헤더에 설정할 수 없다.
res.setContentType("application/octet-stream;charset=KSC5601");
//HTTP헤더에 포함되는 파일명은 영문으로 인코딩해야 한다.
res.setHeader("Content-Disposition", "attachment;filename="+myFile);
//위에서 attachment;가 없으면 다운로드하는 파일이 브라우저에서 바로 열리고
//attachment; 가 있으면 다운로드 창이 열린다.
// 서버의 디스크에 있는 파일을 읽어 오려면 파일 이름이 한글일 경우에는 다시 인코딩을 한글로 한다.
myFile = new String(myFile.getBytes("8859_1"), "KSC5601");
FileInputStream fis = null;
try{
fis = new FileInputStream("c:/"+myFile); // 스트림으로 파일을 연결한다.
}catch(Exception e){e.printStackTrace();}
// 브라우저에 출력할 바이트 스트림을 구한다.
ServletOutputStream out = res.getOutputStream();
byte[] buf = new byte[1024];
int n = 0;
// 파일을 읽어서 브라우저에 전송한다(문자가 아닌 바이트로 전송)
while((n=fis.read(buf, 0, buf.length))!=-1) {
out.write(buf, 0, n);
}
out.close();
}
}