자바(Java)/JAVA 2EE

commons-fileupload 패키지를 사용한 파일 업로드 처리 방법

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

commons-fileupload 패키지를 사용한 파일 업로드 처리 방법

 

commons-fileupload 패키지는 서버의 메모리상에서의 파일 처리가 가능한 파일 업로드 패키지입니다. commons-fileupload 패키지는 commons-io 패키지 기반 위에 작성된 패키지이기 때문에 commons-fileupload 패키지를 사용하기 위해서는 commons-io 패키지를 포함해야 합니다.

 

 

 

 

 


 

 

파일 업로드 처리를 위한 순서는 다음과 같습니다.

1. 폼 데이터가 multipart/form-data 형식으로 전송되었나 검증합니다.

2. 업로드된 파일과 폼 데이터를 담는 DiskFileUpload 객체를 생성합니다. 

3. DiskFileUpload 객체에서 아이템들을 추출합니다. 

4. 추출된 아이템을 하나씩 꺼내서 폼데이터인지 파일인지 분석하여 각각의 처리를 작성합니다.  

 


 

 

 

FileUpload 패키지를 사용한 파일 업로드 과정

import org.apache.commons.fileupload.FileUpload;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;

 

 

boolean isMultipart = FileUpload.isMultipartContent(javax.servlet.http.HttpServletRequest request);

// 폼 데이터의 타입이 multipart/form-data 형식인지 검증합니다. 

 

DiskFileUpload uploadData = new DiskFileUpload();

uploadData.setSizeThreshold ( yourMaxMemorySize );  // 메모리에 올릴 최대 사이즈

uploadData.setSizeMax ( yourMaxRequestSize );          // 업로드될 파일의 최대 사이즈

uploadData.setRepositoryPath ( yourTempDirectory );    // 메모리 용량을 초과하는 파일을 저장한 임시 디렉토리

 

 

// 아이템들을 추출합니다. 

java.util.List items = uploadData.parseRequest( request );

// java.util.List items = uploadData.parseRequest( request, yourMaxMemorySize, yourMaxRequestSize, yourTempDirectory );

 

 

// 아이템들을 컬렉션으로 변환합니다.  

Iterator iter = items.iterator();

 

 

// 컬렉션으로 변환된 아이템들을 하나씩 분석하여 처리합니다. 

while ( iter.hasNext() ) {

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

 

    if ( item.isFormField() ) {

        // 일반 파라미터 처리

    } else {

       // 파일 처리

    } 

 

 

 

 


 

 

 

commons-fileupload 패키지를 사용하여 파일을 처리하면 메모리상에서의 처리가 가능합니다. 물론 파일을 저장할 수도 있습니다. 위의 코드에서 파일을 저장하지 않는다면 메모리상에서 파일을 처리한 후 디스크(저장소)에는 파일이 저장되지 않습니다. 파일을 저장하기 위해서는 다음과 같이 파일을 저장해야 합니다. 다음 부분은 위에서 생략한 파일을 처리하는 부분에 작성하면 됩니다.

if ( item.getSize() < 1 ) { throw new Exception("No file was uploard"); }
    
    fileName = fileItem.getName();
    // 이때 파일 이름은 경로를 포함한 전체 파일명입니다. 따라서 경로를 제거해 주어야 합니다. 
    fileStream = item.getInputStream();   // ** 스트림으로만 처리하면 메모리상으로 처리 **
    
    int index = uploadedFileName.lastIndexOf("\\");
    // '\\' 두개를 해야 \한개를 한 것 같은 작용을 합니다. 
    fileName = uploadedFileName.substring( index + 1 );

    // 경로값을 제거한 실제 파일명입니다.

 

    File file = new File( tempPath + fileName );
   item.write(file);

 

 위의 방법 말고 스트림을 사용하여 파일을 저장하는 방법은 다음과 같습니다.

FileOutputStream outputStream = null;

InputStream inputStream = null;

 

try {

    outputStream = new FileOutputStream(file);  // 위에 파일 객체를 파라미터로 받습니다.

    inputStream = fileItem.getInputStream();

    byte[] buff = new byte[512];  // 버퍼의 크기를 지정

    int streamLength = -1;

 

    while( ( streamLength = inputStream.read(buff) ) != -1 ) {

        outputStream.write(buff, 0 streamLength);

   

} catch(IOException e) {

    ...// 예외처리 

} finally {

    if ( outputStream != null ) try { outputStream.close(); } catch(IOException e) {}