RequestWrapper 클래스
multipart/form-data 형태로 전송된 요청을 분석하는 클래스입니다. 업로드 처리는 하지 않고 파일을 처리하는 부분은 다른 클래스에서 작성해야 합니다. 이 클래스는 요청에 key값에 해당하는 FileItem 객체를 얻기 위한 클래스입니다. 또한, 많은 부분 구현되지 않았지만 올립니다.
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.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");
}
}
'자바(Java) > JAVA 2EE' 카테고리의 다른 글
JSP를 사용하여 XML 문서 제작하기 (0) | 2010.04.27 |
---|---|
서블릿의 시스템 경로 및 요청 경로 구하기 (0) | 2010.04.27 |
JSP 한글 데이터 전송방법 (0) | 2010.03.24 |
HashMap 객체를 JSP페이지에서 JSTL로 표현하기 (0) | 2010.03.03 |
객체를 표현페이지(JSP)에 전달하여 사용하기 (0) | 2010.03.03 |