2009년 12월 8일 화요일

MultipartRequest (cos.jar)와 서블릿을 이용한 업로드

출처 메멘토 (Don't forget) | 메멘토
원문 http://blog.naver.com/sungback/90026956692
CCL

MultipartRequest (cos.jar)와 서블릿을 이용한 업로드

 

Eclipse IDE for Java EE Developers (163 MB) <- 이클립스 다운로드 링크

( 이클립스가 없는 분은 위의 링크 클릭해서 다운받아쓰세요^^ )

 

서블릿으로 업로드와 다운로드를 만들어 두면 모델2에서도 쓰기 편하다.

 

test_cos_servlet.war 파일을 다운받은 후 이클립스에서

 

1. File -> Import -> WAR file -> Next

-> Browse -> test_cos_servlet.war 선택 -> Next

임포트하면 Dynamic Web Project 가 된다.

 

2. 업로드 컴포넌트인 cos.jar 은 선택하지 말고 Finish

    선택하지 않아야 맞다 (이유 : 그래야만 WEB-INF/lib 에 들어가야 되기 때문)

 

3. WebContent 폴더에서 우클릭 -> New -> Folder  해서 upfolder 라는 폴더를 만든다.

    (파일이 업로드될 폴더) Dynamic Web Project 에서는 WebContent 밑에 만든다.

 

4. 아래와 같은 결과가 된다.

 

5. 테스트

서버를 시작하고 웹 브라우저에 아래의 주소로 테스트한다.

http://localhost:8080/test_cos_servlet/uploadform.html

 

6. 결과 : 업로드 결과를 알 수 있고 다운로드도 가능한다.

 

7. 꼭 F5 를 눌러 Refresh를 해야 결과가 보인다.

 

8. abc.txt 링크를 클릭하면 다운를 받을 수 있다.

 

소스는 프로젝트를 Import(임포트) 해 왔기 때문에 다 들어있고 중요한 부분은 다른 색으로 표현했다.

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

uploadform.html

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

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>cos 업로드 테스트 폼</title>
</head>
<body>
<form method="post" action="/test_cos_servlet/UploadServlet" enctype="multipart/form-data">
<table border="1" width="60%">
<tr>
 <td>올린 사람 이름</td>
 <td><input type="text" name="userName" size="10"></td>
</tr>
<tr>
 <td>파일</td>
 <td><input type="file" name="upfile"></td>
</tr>
<tr>
 <td colspan="2">
  <input type="submit" value="전송">
 </td>
</tr>
</table>
</form>
</body>
</html>

 

 

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

web.xml : 서블릿에 대한 설정

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <display-name>test_cos_servlet</display-name>
 <servlet>
  <servlet-name>UploadServlet</servlet-name>
  <servlet-class>upload.UploadServlet</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>DownloadServlet</servlet-name>
  <servlet-class>upload.DownloadServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>UploadServlet</servlet-name>
  <url-pattern>/UploadServlet</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>DownloadServlet</servlet-name>
  <url-pattern>/DownloadServlet</url-pattern>
 </servlet-mapping>
</web-app>

 

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

UploadServlet.java

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

package upload;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import java.util.*;

public class UploadServlet extends javax.servlet.http.HttpServlet implements
  javax.servlet.Servlet {

 // 원래 파일 업로드는 post 방식이기 때문에 goGet은 쓰이지않는다.
 /*
  * protected void doGet(HttpServletRequest request, HttpServletResponse
  * response) throws ServletException, IOException { doPost(request,
  * response); }// doGet
  */
 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/html;charset=euc-kr");
  PrintWriter out = response.getWriter();
  request.setCharacterEncoding("euc-kr");
  /*
   //톰캣 플러그인을 사용하는 경우
   String savePath = getServletContext().getRealPath("upfolder");
   */

  // Dynamic Web Project 의 경우 : 절대 경로를 쓴다.
  String savePath = "C:/eclipse/workspace/test_cos_servlet/WebContent/upfolder";
  // out.println("savePath=" + savePath);//경로 확인

  int maxSize = 5 * 1024 * 1024; // 최대 업로드 파일 크기 5MB(메가)로 제한
  try {
   // 한글 파일명도 업로드 가능하다 : euc-kr
   // 하지만 실제로는 한글 파일명은 처리가 불편하기 때문에 영문 파일을 쓴다.
   MultipartRequest multi = new MultipartRequest(request, savePath,
     maxSize, "euc-kr", new DefaultFileRenamePolicy());
   out.println("<html>");
   out.println("<head><title>화일 업로드List</title></head>");
   out.println("<body>");
   out.println("<pre>");

   Enumeration params = multi.getParameterNames(); // 파라미터명 얻기

   // 반복문으로 모두 출력하기, 현 예제에는 하나지만 나중에 여러개일 경우을 위해 준비

   while (params.hasMoreElements()) {
    String name = (String) params.nextElement();
    String value = multi.getParameter(name);
    out.println(name + " : " + value);
   }//while
   out.println("</pre>");

   out.println("<h3>업로드된 파일에 대한 설명</h3>");
   out.println("<pre>");
   out.println("<table border=1>");
   out.println("<tr>");
   out.println("<td width=150>파일명</td>");
   out.println("<td width=100>파일 크기</td>");
   out.println("<td width=150>파일의 종류</td>");
   out.println("<td width=150>파라미터명</td>");
   out.println("</tr>");

 

   Enumeration files = multi.getFileNames(); // 파일명 모두 얻기

   // 반복문으로 모두 출력, 역시 여러 파일 업로드 경우를 위해 준비

   while (files.hasMoreElements()) {
    String name = (String) files.nextElement();
    String fileName = multi.getFilesystemName(name); // 실제 업로드된 파일명
    String type = multi.getContentType(name);
    File f = multi.getFile(name);
    out.println("<tr>");
    out.println("<td>" + fileName + "</td>");
    if (f != null) {
     out.println("<td>" + f.length() + "</td>");
    }// if
    out.println("<td>" + type + "</td>");
    out.println("<td>" + name + "</td></tr>");
   }// while

   out.println("</table>");
   out.println("</pre>");

   out.println("<h3>업로드된 파일 List</h3>");
   out.println("<pre>");

   File dirFile = new File(savePath); // 업로드 폴더 얻기
   File[] fileList = dirFile.listFiles();  // 현재 폴더의 모든 파일 리스트 얻기

   // 반복문으로 다운로드 링크 걸어주기
   for (int i = 0; i < fileList.length; i++) {
    String fName = fileList[i].getName();
    out.println("<a href='/test_cos_servlet/DownloadServlet?file="
      + fName + "'>" + fName + "</a><br>");
   }// for
   out.println("<pre>");
  } catch (Exception e) {
   out.print("예외 발생 : " + e);
  }// catch
 }// doPost
}// end

 

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

DownloadServlet.java : 다운로드를 담당하는 서블릿

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

package upload;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class DownloadServlet extends javax.servlet.http.HttpServlet implements
  javax.servlet.Servlet {
 public void service(HttpServletRequest req, HttpServletResponse res)
   throws ServletException, IOException {
  /*
  // 톰캣 플러그인을 사용하는 경우
  String dir = getServletContext().getRealPath("WebContent/upfolder");
  */
  String dir = "C:/eclipse/workspace/test_cos_servlet/WebContent/upfolder";
  res.setContentType("euc-kr");
  String filename = req.getParameter("file");
  res.setContentType("application/octet;charset=euc-kr");

  res.setHeader("Content-Disposition", "attachment;filename=" + filename);

 

  // 자바 I/O 를 이용하여 다운로드해 준다.
  byte[] buffer = new byte[1024];
  ServletOutputStream out = res.getOutputStream();
  BufferedInputStream in = null;

  try {
   in = new BufferedInputStream(new FileInputStream(dir + "\\"
     + filename));
   int n = 0;
   while ((n = in.read(buffer, 0, 1024)) != -1) {
    out.write(buffer, 0, n);
   }//while
  } catch (Exception e) {
   out.println("다운로드 예외 발생 : " + e);
   e.printStackTrace();
  } finally {
    if (in != null) try { in.close(); } catch(Exception e) { }
    if (out != null) try { out.close(); } catch(Exception e) { }
  }// finally
 }// service
}// end

댓글 없음:

댓글 쓰기