관리 메뉴

쿰뱅이

파일업로드 (FileItem, DiskFileItemFactory) 본문

WEB/JSP

파일업로드 (FileItem, DiskFileItemFactory)

주년 2011. 10. 11. 14:05
반응형
파일업로드 (FileItem, DiskFileItemFactory)
Servlet에서 파일 업로드를 행하는 프로그램을 작성한다.
Jakarta Commons에서는 파일업로드를 생하는 프로그램을 간단히 작성하는 라이브러리 FileUpload을
제공하고 있다. 여기서는 그 FileUpload을 작성하고, 파일업로드를 행하는 프로그램을 작성한다.

실행환경
・WindowsXP Home Edition
・JDK 1.5.0_04
・Tomcat 5.5.9
・commons-fileupload-1.1.1
・commons-io-1.2

 -> FileUpload인스톨
FileUpload의 인스톨 방법에 대해 설명한다. 인스톨은 간단하다.
Jakarta Project의 사이트에서 FileUpload라이브러리를 다운로드하고, jar파일을 해당하는 디렉토리에
설치할뿐이다.

(1). Jakarta Commons의 다운로드페이지에서 FileUpload라이브러리를 선택한다.


(2). FileUpload라이브러리의 다운로드페이지에서, Binary로 1.1버젼의 zip파일을 다운로드 한다.


(3). 다운로드한 zip파일을 해동하고, 그 안의 commons-fileupload-1.1.1.jar파일을 해당
디렉토리에 설치한다. Tomcat을 이용하고 있는 경우는, 통산 $CATALINA_HOME\common\lib
디렉토리 아래에 설치한다.

 -> IO의 인스톨
FileUpload을 이용하기위해서는, Jakara Common의 IO라이브러리도 필요하다.
IO의 인스톨 방법에 대해서 설명한다.
(1). Jakarta Commons의 다운로드페이지에서 IO라이브러리를 선택한다.


(2). IO라이브러리의 다운로드페이지에서, Binary로 1.2 버젼의 zip파일을 다운로드한다.

(3). 다운로드한 zip파일을 풀고, 그 안의 common-io-1.2.jar파일을 해당디렉토리에 설치한다.

Tomcat을 이용하고 있는 경우는, 통상 $CATALINA_HOME\common\lib 디렉토리 아래에

설치한다.

 

-> fileUpload의 주요 클래스와 주요 메서드

FileUpload에 있는 주요클래스, 주요메소드에 대해서 설명한다.

FileUpload에서는, 파일데이터를 FileItem오브젝트에 관리한다.

* 그외 클래스, 메서드에 대해서는, API레퍼런스를 참조한다.

 

DiskFileItemFactory클래스 ------------------------------------------------------------------

FileItem오브젝트를 생성하는 클래스이다.

메모리, HDD에서 데이터처리에 관한 메소드가 있다.

 

void setSizeThreshold(int)

메모리버퍼의 최대값을 bytes로 지정한다.

용량이 큰 데이터를 업로드 할때는, 최대치를 넘었을 경우

버퍼내의 데이터는 일시영역으로 보존된다.

 

void setRepository(File)

setSizeThreshold메소드에서 지정한 버퍼최대값을 넘었을 경우

버퍼내의 데이터를 보존하는 일시영역을 지정한다.

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

 

ServletFileUpload클래스 --------------------------------------------------------------------

Servlet프로그램을 경유하고, 파일데이터를 취득하는 클래스이다.

파일데이터는 FileItem오브젝트가 저장되었던 List콜렉션으로서 반환된다.

 

List parseRequest(HttpservletRequest)

REC1867에 준거한 형식으로 보내진 데이터를 FileItem오브젝트에 분활하고,

List콜렉션으로서 돌려준다. 보내져온 데이터는 HttpServletRequest오브젝트에서 취득할수 있다.

 

void setSizeMax

업로드할수있는 데이터용량의 최대값을 bytes로 지정한다.

무한대의 경우 -1을 지정한다.

 

void setHearderEncoding(String)

데이터을 수신할 경우의 엔코딩방식을 지정한다.

파일명에 일본어를 지정할 경우는, 특히 지정한 편이 좋다.

지정하지 않는 경우는, 사용하고 있는 플랫폼의 디폴트엔코딩 방식이 사용되어 진다.

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

 

FileItem인터페이스 -------------------------------------------------------------------------

FileItem오브젝트에 관한 메소가 있다.

 

String getName()

업로드된 파일의 파일명을 돌려준다. 파일명은 path명도 포함한다.

 

boolean isFormField()

FileItem오브젝트에 저장되어 있는 값이 파일데이터인지 그외의

FORM데이터인지를 판단한다. 그 밖의 폼데이터의 경우는 true을 반환하고,

파일데이터의 경우는 false을 반환한다.

 

void write(File)

업로드된 데이터를 인수로 지정된 파일에 쓴다.

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

 

-> 사용예~~~

FileUpload라이브러리를 사용하고, 파일의 업로드를 행하는 프로그램을 작성한다.

HTML의 FORM화면에서, 업로드를 행하고 싶은 파일을 선택하고,

업로드를 행하는 프로그램이다.

 

HTML파일의 작성

업로드하는 파일을 선택하는 HTML파일이다.

<FORM>태그의 enctype속성에 "multipart/form-data"을 설정할 필요가 있다.

 

[upFile.html] ------------------------------------------------------------------------------

<html>

<head>

<title>FileUpload</title>

<meta http-equiv="Content-Type" content="text/html; charset="Windows-31J">

</head>

<body>

<!-- (1) <FORM>태그에서 multipart/form-data을 지정 -->

<form method="post" enctype="multipart/form-data" action="UploadFile">

<!-- (2) 파일을 선택하는 <input type="file">태그를 지정-->

 

<input type="file" name="filefd" />

<input type="submit" value="submit"/>

</form>

</body>

</html>

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

 

(1). 파일을 업로드할 때는, <form>태그의 enctype속성에 "multipart/form-data"을 지정한다.

이것은 RFC 1867에 규정하고 있다. action속성에 Submit버튼을 눌렀을때에 이동하는 Servlet

프로그램을 지정한다.

 

(2). 업로드하는 파일을 선택하는 <input type="file">태그를 설정한다.

태그에는 name속성을 지정할 필요가 있다.

 

Servlet프로그램의 작성

FileUpload라이브러리를 사용한 Servlet프로그램을 작성한다.

[UploadFileServlet.java] -------------------------------------------------------------------

package pack;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.*;
import org.apache.commons.fileupload.servlet.*;

public class UploadFileServlet extends HttpServlet {
  public void doPost(HttpServletRequest req,
                     HttpServletResponse res)
                     throws ServletException, IOException {

    //(1)업로드 파일을 저장할 path을 설정
    String path = getServletContext().getRealPath("files");

    //(2)ServletFileUpload오브젝트를 생성
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
  
    //(3)업로드할 때의 기준값을 설정
    factory.setSizeThreshold(1024);
    upload.setSizeMax(-1);
    upload.setHeaderEncoding("Windows-31J");

    try {
      //(4)파일데이터(FileItem오브젝트)를 취득하고、List오브젝트로써 리턴한다.
      List list = upload.parseRequest(req);

      //(5)파일데이터(FileItem오브젝트)을 순서로 처리
      Iterator iterator = list.iterator();
      while(iterator.hasNext()){
        FileItem fItem = (FileItem)iterator.next();
    
        //(6)파일데이터의 경우, if내부를 실행
        if(!(fItem.isFormField())){
          //(7)파일데이터의 파일명(PATH명을 포함한다.)을 취득
          String fileName = fItem.getName();
          if((fileName != null) && (!fileName.equals(""))){
            //(8)PATH명을 제외한 파일명만을 취득
            fileName=(new File(fileName)).getName();
            //(9)파일데이터를 지정된 파일에 쓴다.
            fItem.write(new File(path + "/" + fileName));
          }
        }
      }
    }catch (FileUploadException e) {
      e.printStackTrace();
    }catch (Exception e) {
      e.printStackTrace();
    }
    //(10)upFile.html페이지로 이동
    res.sendRedirect("upFile.html");
  }
}

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

(1). getRealPath메소드를 사용하고, 인수로 지정된값의 path명을 취득한다.

이 path명의 아래에 업로드된 파일을 저장한다.

 

(2). DiskFileItemFactory오브젝트를 인자로, ServletFileUpload오브젝트 upload을 생성한다.

 

(3). DiskFileItemFactory오브젝트, ServletFileUpload오브젝트의 각메소드를 사용하고, 업로드할때

에 기준이 되는 기준값을 설정한다.

 

(4). parseRequest메로드를 사용하고, req오브젝트에서 파일데이터(FileItem오브젝트)를 취득하고、List오브젝트로서 돌려준다.


(5). Iterator인터페이스를 사용하고, list오브젝트에 저장된 FileItem오브젝트를 순으로 꺼내고 처리를 행한다.


(6). 파일데이터인 경우(isFormField메소드에서false경우)、if내부를 실행한다.


(7). getName메소드를 사용해고, 업로드된 파일데이터의 파일명을 취득한다. 파일명으로는 path명도 포함되어 있다.


(8). File오브젝트의 getNmae메소드는 지정된 파일의 파일명만 (PATH명을 포함하지 않는다.)을 취득한 메소드이다. 파일명만을 fileName변수에 저장한다.


(9). write메소드를 사용하고, 파일데이터를 지정된 파일에 쓴다. 쓴 파일은 (1)에서 취득한 PATH명과 (8)로 취득한 파일명이 된다.


(10). 파일업로드처리가 끝나면 다시 upFile.html페이지로 돌어간다.

 

web.xml의 설정

web.xml에 <servlet>태그와 <servlet-mapping>태그를 지정한다.

 

[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
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<web-app>
  <servlet>
    <servlet-name>UploadFileServlet</servlet-name>
    <servlet-class>pack.UploadFileServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UploadFileServlet</servlet-name>
    <url-pattern>/UploadFile</url-pattern>
  </servlet-mapping>
</web-app>

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

-> 실행

[출 처] 1. 파일업로드|작성자 미뉴에트

참고 : http://blog.daum.net/question0921/654

반응형