sitelink1 http://blog.naver.com/sungback/90026956692 
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  

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 가 된다.

 

 

upload_001_sungback.jpg

 

 

 

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

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

 

upload_002_sungback.jpg

 

 

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

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

 

upload_003_sungback.jpg

 

 

 

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

 

upload_004_sungback.jpg

 

 

 

5. 테스트

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

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

upload_005_sungback.jpg

 

 

 

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

 

upload_006_sungback.jpg

 

 

 

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

 

upload_007_sungback.jpg

 

 

 

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

 

upload_008_sungback.jpg

 

 

소스는 프로젝트를 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

 

끝 ^^

 

 

 

번호 제목 글쓴이 날짜 조회 수
171 메모리 유출과 약한 참조 황제낙엽 2010.01.26 616
170 Methods of the Matcher Class 황제낙엽 2010.01.19 120
169 Pattern.matches() , Matcher.matches() , Matcher.find() file 황제낙엽 2010.01.19 105
168 java.lang.IllegalArgumentException 황제낙엽 2010.01.18 130512
167 org.apache.commons.fileupload.servlet.ServletFileUpload 를 이용한 파일 업로드 file 황제낙엽 2009.11.19 129
166 Error reading tld listeners java.lang.NullPointerException 황제낙엽 2009.10.14 67
165 Cannot find the tag library descriptor for “http://java.sun.com/jsp/jstl/core 황제낙엽 2009.10.14 1006
164 Transfer-Encoding: chunked VS Content-Length 황제낙엽 2009.09.17 154
163 서블릿 응답 헤더(Response Header) 황제낙엽 2009.09.17 80
162 같은 문자열인데도 정규식에서 해당 문자열을 파싱하지 못하는 경우 황제낙엽 2009.08.08 39
» MultipartRequest (cos.jar)와 서블릿을 이용한 업로드 file 황제낙엽 2009.06.19 384
160 [대용량 파일 업로드] multipart form parser - http file upload, database 저장 java class 연재2 file 황제낙엽 2009.06.19 1831
159 [대용량 파일 업로드] multipart form parser - http file upload 기능 java class 연재1 file 황제낙엽 2009.06.19 1436
158 [reflection/리플렉션] Class.forName 황제낙엽 2009.05.27 101
157 문자열 내의 공백을 제거하는 간단한 정규식 황제낙엽 2009.05.20 88
156 문자열에서 특수 문자 (Escape Sequence) 처리 file 황제낙엽 2009.02.20 1322
155 정규표현식을 사용하는 String클래스의 replaceAll() 함수 개량 황제낙엽 2009.02.09 219
154 File 복사 함수 황제낙엽 2009.02.08 31
153 JSP session 정보 얻기 황제낙엽 2009.01.21 127
152 서버상의 로컬경로 (실제경로) 관련 환경변수 황제낙엽 2009.01.21 339