Clean Code that Works.


OKJSP 여비님 글 펌입니다.

아래서부터 시작.

------------------------------------------------------------------------------------------------------


오랫동안 검색되고 또 문의 받아온 부분인데 정리해서 올린다 올린다 하다가 이제서야 올리네요 ^^;

 내용은 현재 Tomcat 5.5 까지에서도 해결이 되지 않았던 한글첨부 파일 다운로드 문제에 대한 해결책중 하나 입니다.

 java/jsp 입문이나 실무에서 사용하시라고 올립니다.

테스트환경은 windows2003/SU linux kernel 2.6.x 에서 모두 정상 동작했으며 JDK 1.5.11 에서 돌렸습니다.

도움이 되시길 바랍니다 ^^;

소스 내려갑니다~

 import java.io.*;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.*;
import com.mpage.util.db.*;

/**
 * Servlet implementation class for Servlet: FileDownHelper
 *
 */
 public class FileDownHelper extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    /**
  *
  */
 private static final long serialVersionUID = 1L;

 /* (non-Java-doc)
  * @see javax.servlet.http.HttpServlet#HttpServlet()
  */
 public FileDownHelper() {
  super();
 }    
 
 /* (non-Java-doc)
  * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  Connection con = null;
  Statement st = null;
  ResultSet rs = null;
 
  String idx = request.getParameter("idx");
 
  ServletContext sc = getServletContext();
 
  OutputStream out = null;
 
  try{
   File file = null;
   FileInputStream fis = null;
   byte[] buffer = null;
   String fileName = "";
   String ext = "";
   
   con = DBConnector.getConnection("mysql");
   st = con.createStatement();
   rs = st.executeQuery("select file_name, org_file from board where id=" + idx); // DB 에서 파일명을 가지고 온다.
   
   if(rs != null && rs.next()){
    String seper = "";
    if(System.getProperty("os.name").startsWith("Windows")){ // OS를 구분하여 구분자를 가지고 온다. -- 귀찮아서 프로퍼티에서 가져오기로 수정안함
     seper = "\\";
    }else{
     seper = "/";
    }
    String filePath = sc.getRealPath("/fileUpload") +seper+ rs.getString(1); // 현재 context의 실제 경로 하위의 경로를 설정
    fileName = rs.getString(2);
    ext = rs.getString(2).substring(rs.getString(2).lastIndexOf("."));
   
    file = new File(filePath);
    int size = 0;       // File available size 를 구해서 Buffer 의 크기 설정
   
    fis = new FileInputStream(file);
    size = fis.available();  // 파일의 사이즈를 가져온다
    buffer  = new byte[size];
    fis.read(buffer);
   
    fis.close();
   }
   /*
    * MIME type 설정하는 구문 (필요하면 더 추가하면 됨
    */
   if("zip".equals(ext)){
    ext = "application/zip";
   }else if("ppt".equals(ext)){
    ext = "application/vnd.ms-powerpoint";
   }else if("xls".equals(ext)){
    ext = "application/vnd.ms-excel";
   }else if("doc".equals(ext)){
    ext = "application/msword";
   }else if("txt".equals(ext)){
    ext = "text/plain";
   }else if("html".equals(ext)){
    ext = "text/html";
   }else if("htm".equals(ext)){
    ext = "text/html";
   }else if("jpg".equals(ext)){
    ext = "image/jpeg";
   }else if("jpeg".equals(ext)){
    ext = "image/jpeg";
   }else if("gif".equals(ext)){
    ext = "image/gif";
   }else if("psd".equals(ext)){
    ext = "image/x-photoshop";
   }else{
    ext = "application/zip";
   }
   response.setContentType(ext);
   out = response.getOutputStream();
   
   fileName = fileName.replaceAll(" ", "");
   
   // Browser 설정에 영향이 미치는 부분 처리
   if (request.getHeader("User-Agent").indexOf("MSIE 5.5") > -1) {
    response.setHeader("Content-Disposition", "filename=" +java.net.URLEncoder.encode(fileName, "euc-kr") + ";");
   }else if (request.getHeader("User-Agent").indexOf("MSIE 6.0") > -1) {
    response.setHeader("Content-Disposition", "filename=" +java.net.URLEncoder.encode(fileName, "UTF-8") + ";");
   }else{
    response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "euc-kr") + ";");
   }
   
   if(buffer != null && buffer.length > 0){
    out.write(buffer);
   }
   out.close();
  }catch(Exception e){
   //e.printStackTrace();
  }finally{
   if(out != null){try{out.flush();out.close();}catch(Exception e1){}}
  }
 }   
 
 /* (non-Java-doc)
  * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
 }          
}