JAKARTAPROJECT
JAKARTA TIPJSP TIPJSP 질문&답변DATABASE TIPJAVASCRIPT TIPWEBHACKING TIP기타 TIP
자카르타 프로젝트
자카르타 프로젝트
자카르타 프로젝트 팁 게시판 입니다
Commons-fileupload
GoodBug
이미지 슬라이더 보기

Commons-Fileupload

 

 

I. Commons-fileupload 란?

 

커먼스의 파일 업로드 패키지는 사용법이 쉬우며 쓸만한 함수들을 많이 지원합니다.

SmartUpload, MultipartRequest, Commons fileupload등을 모두 사용해 보았지만 개인적으로 가장 애착이 가는 파일 업로드입니다.

아쉬운점은 Commons-fileupload는 지난 2003년 6월 1.0버젼으로 정식 릴리즈 되었지만 그 이후로 이렇다 할 패치나 보안이 전혀 안되었다는 것입니다. 이말은 파일 업로드 자체가 그리 복잡한 패키지가 아니며 첫 정식 버젼이 그만큼 완벽하다는 것을 반증하는 말이기도 하겠지요 ^^

 

 

II. 다운로드 및 설치

 

자 다운로드 받으러 갑시다.

http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi

설치는 역시나 /WEB-INF/lib/ 폴더에 복사합니다.

 

 

III. 파일 업로드 처리 단계

 

먼저 파일 업로드된 아이쳄을 처리하기 전에 유효한 Request인지 확인해야 합니다.

boolean isMultipart = FileUpload.isMultipartContent(request);

이 코드는 현재 request가 multipart/form-data로 데이터를 전송했는지 유무를 true/false로 반환합니다.

 

업로드된 아이템이 매우 작다면 메모리에서 처리합니다.

 

큰 아이템이라면 임시 파일을 만들어 디스크에 저장하여 처리합니다.

 

너무 큰 아이템이라면 당연히 거부해야 합니다.

 

그렇지 않고 디폴트로 설정한 메모리, 최대값의 범위를 초과하지 않는다면 업로드를 시작합니다.

② ~ ⑤ 까지를 다음과 같이 간단히 할 수 있습니다.

// 파일 업로드 핸들러를 생성
DiskFileUpload upload = new DiskFileUpload();

// 한번에 메모리에 저장할 사이즈 설정

upload.setSizeThreshold(yourMaxMemorySize);

// 파일 업로드 최대 사이즈를 설정

upload.setSizeMax(yourMaxRequestSize);

// 파일 업로드 경로를 설정
upload.setRepositoryPath(yourTempDirectory);

이제 전송된 request를 parsing하여 아이템들을 추출합니다.

List /* FileItem */ items = upload.parseRequest(request);

위에서 설정한 값들을 request parsing단위로 따로 설정 할 수 있습니다.

List /* FileItem */ items = upload.parseRequest(request,
        yourMaxMemorySize, yourMaxRequestSize, yourTempDirectory);

 

이렇게 추출된 items를 이제 폼필드 타입에 따라 적절히 처리 합니다.

Iterator iter = items.iterator();
while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();

    // 파일 타입이 아닌 다른 폼필드라면
    if (item.isFormField()) {
        processFormField(item);

 

    // 파일 타입 폼필드라면
    } else {
        processUploadedFile(item);
    }
}

 

폼필드에 따른 처리

만약 폼필드가 파일 이외의 파라미터라면 다음과 같이 처리하면 됩니다.

if (item.isFormField()) {
   //파라미터 이름

    String name = item.getFieldName();          

   //파라미터 값

    String value = item.getString();              
    ...
}

 

만약 폼필드가 파일 파라미터라면 다음과 같이 처리하면 됩니다.

if (!item.isFormField()) {

    // 파라미터 이름
    String fieldName = item.getFieldName();

    // 파일 이름 (경로포함)
    String fileName = item.getName();
    String contentType = item.getContentType();

    // 업로드한 파일이 메모리에 저장된 상태면 true, 거렇지 않고 임시 파일로 저장된 경우 false를 리턴
    boolean isInMemory = item.isInMemory();

    // 파일사이즈
    long sizeInBytes = item.getSize();
    ...

 

   // 파일 객체를 하나 만들어 업로드 완료!

   File uploadedFile = new File(...);

   item.write(uploadedFile);
}

 

파일 업로드 방식

파일 업로드 방식에는 모두 3가지가 존재합니다.

-. FileItem.write(File file);

-. FileItem.getInputStream();

-. FileItem.get()

 

write 는 직접적으로 업로드한 파일을 저장하는 가장 일반적이고 간단한 방식입니다.

나머지 두 방식은 스트림을 사용하여 업로드한 파일이 어떤 특별한 처리를 할 때 사용합니다.  혹은 데이터베이스에 바로 저장 할 경우에도 사용될 수 있습니다. 특히 get()은 메모리에 모두 할당하여 작업을 하니 주의를 요합니다.

 

 

VI. 샘플코드

 

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;

 

public class UploadServlet extends HttpServlet {

 

   String upload = null;


   public void init(ServletConfig config) throws ServletException {
      super.init(config);  
      upload = config.getServletContext().getRealPath("/upload/")
   }
 
   public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      try {
  
         if (FileUpload.isMultipartContent(request)) {

            DiskFileUpload fileUload = new DiskFileUpload();
            fileUpload.setRepositoryPath(upload);
            fileUpload.setSizeMax(100*1024*1024);
            fileUpload.setSizeThreshold(1024*50);
    
            List items = fileUpload.parseRequest(request);

 

            Iterator iterator = items.iterator();
            while (iterator.hasNext()) {


                FileItem item = (FileItem) iterator.next();

                if (!item.isFormField()) {
                    if (fileItem.getSize() > 0) {
                        //파일 이름을 가져온다      
                        String filename = fileItem.getName().substring(fileItem.getName().lastIndexOf("\\")+1);
       
                         try {
                              File file = new File(upload+filename);
                              fileItem.write(file);
                              } catch (IOException e) {
                                   System.out.println(e);
                              }       
                         }
                    }
               }
          }

      } catch (org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e) {

          // 파일 사이즈 초과시 발생하는 익셉션
          System.out.println("파일 사이즈가 100메가 보다 더 초과되었습니다");
      } catch (Exception e) {
          System.out.println("업로드시 예기치 못한 오류가 발생하였습니다");
      }
   }
}

 

=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

2009-03-29 20:12:43
211.189.124.***

 

좋은생각 ^^

10점 (1명)
중독성 겜 --;; 1 GoodBug 2005-02-25
웹에서 드래그 & 드롭을! 1 GoodBug 2005-03-09
upload Commons-fileupload 2 Tag 2 GoodBug 2005-02-20
Using Jakarta Ant GoodBug 2005-11-12
사용자관련 테이블 GoodBug 2005-04-02
컴파일 에러 jsp 초보 2005-03-11
시간이 흘러서 지금은 DiskFileUpload는 Deprecated 되었습니다. Commons-Fileupload 한글처리 3 Tag 3 수시아 2005-03-11
[답변] 컴파일 에러 GoodBug 2005-03-11
덧글 2개 | 태그 2개 | 관련글보기
태그입력
쉽표(,)구분으로 한번에 여러 태그를 입력할수 있습니다
commons (16) upload (3)
미리내
(0) (0)
이것도 감사^^ 열심히 공부하겠습니다^^
202.211.32.*** 2005-12-09 17:43:41
highharbor
(0) (0)
파일업로드 관련글 ㅤㅊㅏㅊ다가 또 g~~ooooood~~bug님의 글을 보네요..

얌얌...


168.188.60.*** 2008-01-10 09:06:02
이름 비밀번호
자카르타 프로젝트
자카르타 프로젝트 팁 게시판 입니다
! 번호 제목 글쓴이 일자 조회
Hierarchy of the Apache Software Foundation GoodBug 2005-10-14 10,741
Jakarta Project 강좌 게시판입니다 8 GoodBug 2005-04-03 11,614
44 Log4J log4j에서 e.printStackTrace() 메시지를 log에 남기는 방법 1 kaiser 2008-10-22 17,547
43 DBUtils DBUtils에서 Clob 사용하기 3 1 GoodBug 2007-08-28 10,569
42 Spring Spring 설정 파일 로딩 1 GoodBug 2007-07-16 11,253
41 POI POI의 HSLF를 이용하여 PowerPoint 문서를 읽어보자 2 GoodBug 2007-05-28 14,837
40 POI POI의 HWPF를 이용하여 MS WORD문서를 읽어보자 2 GoodBug 2007-05-28 16,758
39 Validator Validator 속성들 1 GoodBug 2007-05-11 10,329
38 dd Commons-Fileupload 1.2 1 2 GoodBug 2007-04-23 15,267
37 Apache Apache2 + Tomcat5.5 + mod_jk 4 바이러스天国 2007-01-29 10,970
36 DBUtils DBUtils에서 number 타입의 컬럼이 int형으로 안넘어올때.. 3 1 GoodBug 2006-06-28 10,679
35 흠흠 위험한 static Logger 필드... 2 1 서연아빠 2006-03-16 10,051
34 Installing Tomcat with commons-daemon (jsvc) GoodBug 2006-01-08 9,005
33 commons Commons DbUtils 몇가지 예제 3 2 GoodBug 2005-11-17 15,124
32 commons Jakarta Commons Net 에서 FTP 사용시 목록이 안보일 경우 2 GoodBug 2005-11-15 21,699
31 listFiles() 에서 null 을 반환 추적.. 신만두 2008-11-11 11,770
30 commons 목록이 안보일 경우 해결기 I탄 1 2 GoodBug 2005-12-23 15,859
29 POI POI로 엑셀파일 읽을때, Invalid header signature 에러 1 GoodBug 2005-11-12 16,468
28 log4j log4j, JSP에서 원하는 Appender 골라쓰기 1 GoodBug 2005-11-07 13,825
27 commons Commons-Email~ 7 2 GoodBug 2005-10-13 17,787
copyright 2005-2017 by Unicorn