자바(Java)/JAVA 2EE

commons 패키지를 사용한 파일 업로드 클래스

본클라쓰 2010. 4. 20. 13:17

RequestWrapper 클래스

 

 multipart/form-data 형태로 전송된 요청을 분석하는 클래스입니다. 업로드 처리는 하지 않고 파일을 처리하는 부분은 다른 클래스에서 작성해야 합니다. 이 클래스는 요청에 key값에 해당하는 FileItem 객체를 얻기 위한 클래스입니다. 또한, 많은 부분 구현되지 않았지만 올립니다.

import java.io.File;
import java.util.HashMap;

import java.util.Iterator;

 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

 

import kr.co.common.util.CurrentDay;

 

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

 

public class MultipartRequest extends HttpServletRequestWrapper {
    private static int MAX_BUFF_SIZE = 1024 * 1024 * 10; // 버퍼 사이즈
    private static int MAX_FILE_SIZE = 1024 * 1024 * 10; // 업로드 파일 최대 사이즈
    //private static String TEMP_DIRECTORY = "/temp";   // 템프 디렉토리
 
    private static HttpServletRequest REQUEST = null;
    protected HashMap<String, String> FILED_ITEMS = new HashMap<String, String>();
    protected HashMap<String, FileItem> FILE_ITEMS = new HashMap<String, FileItem>();
 
    @SuppressWarnings("deprecation")
    public MultipartRequest(HttpServletRequest request) throws FileUploadException {
        super(request);
        REQUEST = request;
  
        try {
            boolean isMultipart = ServletFileUpload.isMultipartContent(REQUEST);
            if ( !isMultipart ) { throw new FileUploadException(); }
   
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(MAX_BUFF_SIZE);
            //factory.setRepository(TEMP_DIRECTORY);

   
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setSizeMax(MAX_FILE_SIZE);
   
            Iterator<?> itemIter = upload.parseRequest(request).iterator();
            while ( itemIter.hasNext() ) {
                FileItem fileItem = (FileItem)itemIter.next();
    
                if ( fileItem.isFormField() ) {
                    FILED_ITEMS.put(fileItem.getFieldName(), fileItem.getString());
                } else  {
                    FILE_ITEMS.put(fileItem.getFieldName(), fileItem);
                }
            }
   
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
 
    public HashMap<String, String> getFieldItems(){
        return FILED_ITEMS;
    }
    public HashMap<String, FileItem> getFileItems() {
        return FILE_ITEMS;
    }
 
    public String getParameter(String name) {
        return (String)FILED_ITEMS.get(name); 
    }
    public FileItem getFileItem(String name){
        return FILE_ITEMS.get(name);
    }
    public String getFileName(String name) {
        return getFileItem(name).getName(); 
    }
    @SuppressWarnings("deprecation")
    public String uploadFile(String uploadPath, String name) {
        try {
            String realPath = REQUEST.getRealPath(uploadPath);
            FileItem fileItem = getFileItem(name);
            String fileName = getFileName(name);
   
            //### 경로를 제거한 파일명을 얻기 위한 방법 ###

            int index = fileName.lastIndexOf("\\");
            fileName = fileName.substring( index + 1 );
   
            CurrentDay current = new CurrentDay();
            String currentDate = current.getDate();
            //  파일명 중복을 피하기위한 부분  
            File file = new File(realPath, currentDate +"_"+ fileName);
            if ( file.exists() ) {
                for ( int i = 0 ; i < 30 ; i++ ){
                    int randomValue = (int)( Math.random()*100 );
                    file = new File(realPath, currentDate+"_"+randomValue+"_"+fileName);
                    if ( !file.exists() ) { break; }
                } 
            }
   
            fileItem.write(file);
            return realPath +"\\"+ file.getName();
   
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
 
}

 

 

 

실제 위 Wrapper 클래스를 사용하는 예제

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import kr.co.common.MultipartRequest;

 

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

 

public class EmployeeImageAction extends Action {
 
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
                        HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("euc-kr");
  
        MultipartRequest multipart = new MultipartRequest(request);
        String imgPath = multipart.uploadFile("\\upload\\employee", "photo");
  
        request.setAttribute("isSuccess", true);
        request.setAttribute("source", imgPath);
   
        return mapping.findForward("upload");
    }
}