자바(Java)/JAVA 2EE

MultipartRequest 클래스를 사용한 파일 업로드

본클라쓰 2010. 1. 16. 11:38

파일 업로드API  MultipartRequest 클래스 사용방법

 

 클라이언트가 서버로 파일을 업로드하면 서버는 파라미터를 분석하여 파일을 찾고 서버의 자원에 저장하는 과정을 거쳐야 합니다. 자카르타 프로젝트에서는 해당 기능을 가진 MultipartRequest 클래스를 제공합니다.

 

배포 사이트 : http://www.servlets.com 

직접 다운로드 :

cos-26Dec2008.zip

 

 MultipartRequest 클래스는 cos.jar 컴포넌트에 포함되어 있으며 클라이언트가 보낸 multipart/form-data 타입의 POST 요청을 분석하여 일반 필드와 파일을 구분하여 파일 데이터에 접근하는 방법을 제공하는 클래스입니다.

 

 다운로드 받는 cos.jar 컴포넌트 zip 파일을 압축해제 한 후 해당 어플리케이션의 WEB-INF/lib 디렉토리에 cos.jar 파일을 포함시킵니다. 또한, 톰캣의 /common/lib 디렉토리와 JDK lib 디렉토리에 해당 콤포넌트를 복사합니다. 콤포넌트가 등록되었다면 클라이언트가 서버로 파일을 올릴 수 있도록 폼 요소를 작성합니다.

 

참고 

 개발툴로 이클립스를 사용한다면 파일 업로드를 할 프로젝트에서 속성을 선택한 후 [java build path]에 [library] 탭에서 외부 jar 파일 추가를 선택하여 cos.jar 파일을 추가 시킵니다. 그 다음 [webContent] - [WEB_INF] - [lib] 폴더에 마우스 오른쪽 버튼을 클릭한 후 [import!] - [file System]을 선택하여 cos.jar 파일을 lib에 추가 시키면 됩니다. 

  

 

 

 

1. 클라이언트가 서버로 파일을 전송하기위한 폼 요소 작성법

 

<form name="폼이름" action="업로드 페이지URL" method="post" enctype="multipart/form-data" >

    업로드 할 파일 : <input type="file" name="file"/>

    <input type="submit" value="업로드"/> 

</form>

 폼 요소를 작성할 때 중요한 것은 method 속성의 값을 post로 주고 enctype 속성에 "mulitpart/form-data"를 지정하는 것입니다. multipart/form-data 속성은 파라미터를 요청 헤더에 포함시키며 파일 전송을 가능하게 합니다.

 

 

 

2. 업로드를 처리하는 JSP 페이지 (MultipartRequest 클래스 사용)

<%@ page contentType="text/html;charset=euc-kr" %>

 

<%@ page import!="com.oreilly.servlet.MultipartRequest" %>
<%@ page import!="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@ page import!="java.util.*" %>
<%@ page import!="java.io.*" %>

 

<%
 String encType="euc-kr";
 int maxSize=5*1024*1024;
 String saveFolder="d:\fileSave"; // 절대경로
 

// 서버의 어플리케이션 경로를 구하는 방법
 //ServletContext context=getServletContext();    
 //String realFolder=context.getRealPath(saveFolder);
 //out.println("the realpath is "+realFolder+"<br>");
 
try{
    MultipartRequest multi = new MultipartRequest(request, saveFolder, maxSize,
        encType, new DefaultFileRenamePolicy());
  
  /* <form>태그 안에 있는 모든 파라미터의 종류와 값을 출력(속성이 file인 경우 제외)*/
    Enumeration params=multi.getParameterNames();
  
    while( params.hasMoreElements() ){
        String name=(String)params.nextElement();
        String value=multi.getParameter(name);
        out.println(name +" = "+value+"<br>");
    }


    out.println("--------------------------<br>");
  
  
    /* <form>태그의 file 속성에 해당하는 파라미터 대한 출력 */
    Enumeration files=multi.getFileNames();
  
    while( files.hasMoreElements() ){
        String name=(String)files.nextElement();


        File file=multi.getFile(name);
   
        out.println("파라메터이름 : "+name+"<br>");
        out.println("실제 파일 이름 : "+multi.getOriginalFileName(name)+"<br>");
        out.println("저장된파일이름 : "+multi.getFilesystemName(name)+"<br>");
        out.println("파일타입 : "+multi.getContentType(name)+"<br>");
   
        if (file!=null) {
           out.println("크기:"+file.length());
           out.println("<br>");
        }
    }
  
    }catch(IOException e){
        System.out.println(e);
    }catch(Exception ex){
        System.out.println(ex);
 }
%>

 

 MultipartRequest 클래스는 서버의 메모리상의 처리는 하지 않고 파일의 업로드 자체만 다루는 클래스입니다. 또한, 한글 인코딩 값을 얻기도 쉬우며 서버 디렉토리내에 같은 파일명이 있을 경우 파일명을 자동으로 변경해주는 등 업로드 자체만 본다면 좋은 컴포넌트입니다.

 

  

 

 

* MultipartRequest 클래스 생성

MultipartRequest multipartFormData = new MultipartRequest( request, fileDirectory, fileSize, encoding, new DefaultFileRenamePolicy() );

 

 MultipartRequest 클래스는 생성시 몇 개의 인자를 필요로 합니다. 생성시 필요한 인자는 { 요청 Request, 파일이 저장될 디렉토리, 저장할 수 있는 파일의 최대 사이즈, 파일명의 인코딩, 중복 파일 이름 변경 정책 } 이 있습니다. 파일의 저장될 디렉토리는 서버상의 절대경로값입니다. 이 때 해당 경로가 없다면 예외처리됩니다. 또한, 파일 사이즈는 바이트 단위입니다. 1KB는 1024이며, 5KB 까지 업로드가 되게 하려면 5 * 1024를 입력합니다.

 new DefaultFileRenamePolicy() 클래스는 파일이 저장되는 디렉토리에 같은 이름을 가진 파일이 존재한다면 파일명 뒤에 추가적으로 숫자를 붙여 파일명의 중복을 피하는 파일명 중복처리 클래스입니다.  

 

 

 

 

 

* MultipartRequest 클래스 메소드

Enumeration getParameterNames() : 폼에서 전송한 파라미터들의 이름을 Enumeration 객체로 반환합니다. 폼에 있는 input 태그 중 file 속성이 아닌 모든 파라미터들의 이름을 반환하는 메소드입니다.

 

String getParameter(name) : 파라미터의 이름을 매개변수로 하여 그 파라미터의 값을 반환하는 메소드입니다.

 

Enumeration getFileNames() : 이 메소드는 폼 요소 중 file 속성을 가진 파라미터 이름을 Enumeration 객체로 반환합니다.

 

String getFilesystemname(name) : file 속성으로 지정된 파라미터 통해 실제 서버상에 업로드 된 파일 이름을 String 객체로 반환합니다. 이 메소드가 반환하는 파일명은 실제 서버 상에 저장된 파일 이름입니다. 업로드시 리네임 정책에 의해 파일명이 변경될 수 있으며 변경되었다면 변경된 파일이름을 반환합니다.

 

String getOriginalFileName(name) : 파일 업로드시 중복된 파일 이름을 통해 파일이 덮어써지는 것을 방지하기 위해 사용되는 FileRenamePolicy 인터페이스를 구현한 DefaultFileRenamePolicy 클래스에 의해서 파일명이 변경되기 전의 파일명을 반환합니다.

 

String getContentType(name) : 업로드 된 파일의 콘텐츠 타입을 반환합니다. 

 

File getFile(name) : 서버상에 업로드 된 파일에 대한 파일 객체를 반환합니다.  

 

 

 

 

 

※ 참고 - 웹 어플리케이션의 시스템 경로 구하기

String saveFolder = "/uploadFiles";

 

ServletContext context = getServletContext();

// 어플리케이션 객체를 얻습니다.

 

String realPath = context.getRealPath(saveFolder);

// 어플리케이션의 절대 경로와 지정한 폴더를 합치 경로 값을 반환합니다.

 여기서 경로를 구분할 때 사용하는 기호는 "\(역슬러시, 백스페이바 옆에 있는 키 )" 가 아니라 "/(슬러쉬키, 오른쪽 쉬프트키 옆)"에 있는 키입니다. ServletContext.getRealPath() 메소드를 사용하여 실제 웹 어플리케이션의 루트 경로를 반환합니다. 여기에 파라미터로 주는 경로 값을 루크 경로를 기준으로 파라미터가 포함된 경로를 반환합니다.


 ex) 루트 폴더 기준으로 jsp/fileSave 폴더에 파일을 저장하고자 한다면 다음과 같이 작성하시면 됩니다.

saveFolder = "jsp/fileSave";

 

ServletContext context=getServletContext();    
String realFolder=context.getRealPath(saveFolder);

 

cos-26Dec2008.zip
0.27MB