티스토리 뷰

728x90
반응형
사이드 프로젝트로 Spring이 아닌 jsp/servlet 을 이용하여 프로젝트를 만든 적이 있습니다.
Spring은 파일 처리할때 정말 편리하지만 jsp/servlet은 Spring 처럼 편리함을 제공하지 않고 직접 처리를 해줘야 했었습니다. 특히 파일 처리할 때 이리 불편할 수가 없었습니다.
그래서 파일처리 방식을 커스텀하여 직접 사용하였던 방식들을 공유하려고 합니다.
Jsp/servlet 에서 기본적으로 파일업로드를 진행했을 때 사용하는 것이 MultipartRequest를 제공하는 라이브러리인 cors.jar 를 많이 사용합니다. 하지만 필자가 MultipartRequest 를 사용하면서 어떻게 보면 편리하긴 한데 너무 제한적인 부분들이 많았고 컨트롤이 어려웠던 부분들이 있었습니다.

그래서 필자는 새로 커스텀을 작업 하여 MultipartRequest를 사용하지 않고 파일과 request parameter들을 처리하는 방법을 채택했습니다.

그럼 예제 코드를 살펴보겠습니다.

 

아래 메소드를 보게 되면 간단하게 HttpServletRequest 파라미터들을 가져와서 파일데이터는 저장을 처리하고 그 외 파라미터는 map 형식으로 전달하는 방식을 표현해 보았습니다.

requestParamUtil 메소드
private Map<String,Object> requestParamUtil(HttpServletRequest request,String path) throws FileUploadException { 

	File upload_dir = new File(path); 
	DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); 
	diskFileItemFactory.setRepository(upload_dir); 
	diskFileItemFactory.setSizeThreshold(fileDTO.sizeLimit); 
	ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);			 
	return fileUpload.parseRequest(request); 
        
        Map<String,Object> map = new HashMap<String, Object>();
	try { 
		for(FileItem item : items) { 
			if(item.isFormField()) { 
			    map.put(item.getFieldName(),item.getString("utf-8"));                     
			}else { 
			    int index = item.getName().lastIndexOf(File.separator); 
			    String fileName = item.getName().substring(index+1); 
			    map.put(item.getFieldName(),fileName); 
                            File file = new File(path+File.separator+fileName);
                            item.write(file);
			} 
		} 
	}catch (Exception e) { 
		log.debug("request parameter(not file)  error : "+e.getMessage()); 
		return null; 
	}
}

상세히 열어보자

1. 파일 데이터를 처리하기 위한 환경 설정
File upload_dir = new File(path); 
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();  
diskFileItemFactory.setRepository(upload_dir);  
diskFileItemFactory.setSizeThreshold(fileDTO.sizeLimit);  
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);			  
return fileUpload.parseRequest(request);
DiskFileItemFactory : FileItem 오브젝트를 생성하는 클래스
  • setRepository : setSizeThreshold 메소드에서 지정한 버퍼 최대값을 넘었을 경우 버퍼내의 데이터를 보존하는 일시영역 지정
  • setSizeThreshold : 메모리 버퍼의 최대값을 btyes로 지정한다. 버퍼 최대치를 넘어갈 경우 버퍼내의 데이터는 일시영역으로 보존.
 
ServletFileUpload : 파일 데이터를 가지게 되는 클래스로 FileItem 오브젝트로 저장된 데이터를 list로 반환
  • setSizeMax(long sizeMax) : 전체 파일의 업로드 최대 크기 설정
  • setFileSizeMax(long fileSizeMax) : 개별 파일별 업로드 최대 크기 설정
  • parseRequest(HttpServletRequest) : REC1867에 준거한 형식으로 보내진 데이터를 FileItem 오브젝트에 분할하고 list 로 반환.
 
2.FileItem 콜렉션으로 가져오게 된 데이터를 파일 데이터와 그렇지 않은 데이터를 분리 처리
Map<String,Object> map = new HashMap<String, Object>();
for(FileItem item : items) { 
    if(item.isFormField()) {  
	    map.put(item.getFieldName(),item.getString("utf-8"));                      
    }else {  
	    int index = item.getName().lastIndexOf(File.separator);  
	    String fileName = item.getName().substring(index+1);  
	    map.put(item.getFieldName(),fileName);  
            File file = new File(path+File.separator+fileName); 
            item.write(file); 
    }  
}
FileItem 관련 메소드 설명은 아래 링크를 확인바랍니다.

 

마치면서..

위에 코드는 기본적인 처리 프로세스를 나타낸 예제입니다. 여기서 어떻게 커스텀하냐는 작업하는 여러분에게 달려있습니다. 이와 같은 내용을 바탕으로 자신의 입맛에 맞는 형태의 코드로 만들어갔으면 좋겠습니다 ~

728x90
반응형
250x250
반응형
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함