본문 바로가기

Servlet/DownloadServlet

DownloadServlet

브라우저에 출력되는 것을 막고 다운로드 창이 열리도록 하는 예제

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();
  }
}