Tomcat 한글 파일 처리 Servlet
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
}
}