파일 업로드API MultipartRequest 클래스 사용방법
클라이언트가 서버로 파일을 업로드하면 서버는 파라미터를 분석하여 파일을 찾고 서버의 자원에 저장하는 과정을 거쳐야 합니다. 자카르타 프로젝트에서는 해당 기능을 가진 MultipartRequest 클래스를 제공합니다.
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. 클라이언트가 서버로 파일을 전송하기위한 폼 요소 작성법
업로드 할 파일 : <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 클래스는 생성시 몇 개의 인자를 필요로 합니다. 생성시 필요한 인자는 { 요청 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) : 서버상에 업로드 된 파일에 대한 파일 객체를 반환합니다.
※ 참고 - 웹 어플리케이션의 시스템 경로 구하기
ServletContext context = getServletContext();
// 어플리케이션 객체를 얻습니다.
String realPath = context.getRealPath(saveFolder);
// 어플리케이션의 절대 경로와 지정한 폴더를 합치 경로 값을 반환합니다.여기서 경로를 구분할 때 사용하는 기호는 "\(역슬러시, 백스페이바 옆에 있는 키 )" 가 아니라 "/(슬러쉬키, 오른쪽 쉬프트키 옆)"에 있는 키입니다. ServletContext.getRealPath() 메소드를 사용하여 실제 웹 어플리케이션의 루트 경로를 반환합니다. 여기에 파라미터로 주는 경로 값을 루크 경로를 기준으로 파라미터가 포함된 경로를 반환합니다.
ex) 루트 폴더 기준으로 jsp/fileSave 폴더에 파일을 저장하고자 한다면 다음과 같이 작성하시면 됩니다.
saveFolder = "jsp/fileSave";
ServletContext context=getServletContext();
String realFolder=context.getRealPath(saveFolder);
'자바(Java) > JAVA 2EE' 카테고리의 다른 글
fileupload패키지의 FileItem 클래스 정의 (0) | 2010.01.16 |
---|---|
commons-fileupload 패키지를 사용한 파일 업로드 처리 방법 (0) | 2010.01.16 |
클라이언트가 파일을 다운로드 받을 수 있게 처리하는 방법 (0) | 2010.01.16 |
페이지 소스보기에서 공백(JSP가 사용된 부분) 제거하기 (0) | 2010.01.15 |
캐시(cache) 사용금지를 위한 응답 헤더 설정 (0) | 2010.01.11 |