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

 

끝 ^^

 

 

 

번호 제목 글쓴이 날짜 조회 수
43 세션의 timeout 설정 >> HttpSession.setMaxInactiveInterval() 황제낙엽 2019.07.03 8649
42 jQuery JSON 데이터 통신의 특성 (HttpServletRequest) 황제낙엽 2019.06.23 581
41 [HttpURLConnection] 서버와의 통신 시도 시점 관련 황제낙엽 2019.06.23 650
40 응답 헤더의 Content-disposition 속성 황제낙엽 2019.04.16 902
39 Java에서 User-Agent 파써 사용하기 황제낙엽 2017.11.20 843
38 서버구동시 주기적으로 동작을 수행하는 스레드를 함께 실행하는 서블릿 황제낙엽 2017.08.02 551
37 JSP 파일에서 getOutputStream() has already been called for this response 에러 황제낙엽 2013.04.24 11973
36 [The type HttpUtils is deprecated] javax.servlet.http.HttpUtils 황제낙엽 2013.03.20 628
35 Java에서 URL 다루기 file 황제낙엽 2012.06.24 454
34 HttpServletResponse.setContentType(java.lang.String type) 과 MIME 타입 황제낙엽 2012.04.20 576
33 한글 파일명 깨짐으로 살펴본 다국어 처리 문제 (UTF-8) 황제낙엽 2012.03.22 10508
32 <jsp:include>, include지시자 file 황제낙엽 2011.07.24 498
31 <jsp:include> 액션태그 황제낙엽 2011.07.24 451
30 Servlet의 각종 Listener 사용방법 및 샘플 황제낙엽 2010.10.26 450
29 ServletContext 초기화 및 소멸 황제낙엽 2010.10.26 461
28 ServletConfig 이용하기 황제낙엽 2010.03.15 520
27 Transfer-Encoding: chunked VS Content-Length 황제낙엽 2009.09.17 573
26 서블릿 응답 헤더(Response Header) 황제낙엽 2009.09.17 524
» MultipartRequest (cos.jar)와 서블릿을 이용한 업로드 file 황제낙엽 2009.06.19 713
24 JSP session 정보 얻기 황제낙엽 2009.01.21 492