FileUpload API를 이용하기 위해선 FileUpload API를 다운로드 해 WEB_INF/lib 폴더에 jar 파일 복사 해준다.

* FileUpload API를 이용한 multpart/form-data 처리 예제
1) 폼 작성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<html>
<head>
<title>fileupload 폼</title>
</head>
<body>
<form action="fileupload.jsp" method="post" enctype="multipart/form-data">
text1: <input type="text" name="text1" /><br/>
file1: <input type="file" name="file1"><br/>
file2: <input type="file" name="file2"><br/>
<input type="submit" value="전송" />
</form>
</body>
</html>

2) FileUpload API를 이용해 multpart/form-data로 전송된 데이터 화면에 출력하기
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<html>
<head>
<title>업로드 정보</title>
</head>
<body>
<%
//1. multpart/form-data 여부 확인
boolean isMultpart = ServletFileUpload.isMultipartContent(request);
if(isMultpart) {
//2. 메모리나 파일로 업로드 파일 보관하는 FileItem의 Factory 설정
DiskFileItemFactory factory = new DiskFileItemFactory();
//3. 업로드 요청을 처리하는 ServletFileUpload 생성
ServletFileUpload upload = new ServletFileUpload(factory);
//파일명의 한글이 깨져서 추가!
upload.setHeaderEncoding("euc-kr");
//4. 업로드 요청 파싱해서 FileItem 목록 구함
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter=items.iterator();
while(iter.hasNext()) {
FileItem item = iter.next();
//5. FileItem이 폼 입력 항목인지 여부에 따라 알맞은 처리
if(item.isFormField()) {
String name=item.getFieldName();
String value = item.getString("euc-kr");
%>
요청 파라미터: <%= name %>=<%= value %> <br/>
<%
} else {
String name=item.getFieldName();
String fileName=item.getName();
String contentType=item.getContentType();
boolean isInMemory=item.isInMemory();
long sizeInBytes = item.getSize();
%>
파일: <%= name %>, <%= fileName %>, <%= sizeInBytes %>
<%= isInMemory ? "메모리 저장" : "임시 파일 저장" %>
<br/>
<%
}
}
} else { // multipart/form 아님
%>
multipart/form 요청이 아님
<%
}
%>
</body>
</html>


업로드한 파일명의 한글이 깨져서 upload.setHeaderEncoding("EUC-KR"); 코드를 추가해주었다.
※ FileItem 클래스는 multpart/form-data로 전송된 파라미터 또는 파일 정보를 저장하고 있는 클래스로서
위 코드 속 isFormField, getFieldName(), getName(), isInMemory(), getSize()는 FileItem 클래스가 제공하는 메소드이다.
메소드 | 리턴 타입 | 설명 |
isFormField() |
boolean | 파일이 아닌 일반적인 입력 파라미터일 경우 true 리턴 |
getFieldName() | String | 파라미터의 이름을 구한다. |
getName() | String | 업로드한 파일의(경로를 제외한) 이름을 구한다. |
isInMemory() | boolean | 업로드한 파일이 메모리에 저장된 상태인 경우 true 리턴 임시 디렉터리에 저장된 경우 false 리턴 |
getSize() | long | 업로드한 파일의 크기를 구한다. |
※ DiskFileItemFactory 클래스는 업로드 파일의 크기가 지정한 크기를 넘기 전까지는 업로드한 파일의 데이터를 메모리에 저장하고 지정한 크기를 넘길 경우 임시 디렉터리에 파일로 저장한다.
setSizeThreshold(int sizeThreshold), setRepository(File repository) 두 메소드로 임시 파일이 저장될 디렉터리와 메모리에 보관할 최대 크기를 변경 할 수 있다.
※ ServletFileUpload 클래스는 setSizeMax(long sizeMax), setFileSizeMax(long fileSizeMax) 메소드로 한 번에 업로드 할 수 있는 전체 파일의 크기 및 각 파일별로 업로드 할 수 있는 파일의 크기를 설정할 수 있다.

'Dev > Java' 카테고리의 다른 글
response 기본 객체 (0) | 2022.09.29 |
---|---|
(JSP2.1) 답변형 게시판 구현 - 목록 구현하기 (0) | 2022.09.28 |
파일 전송을 위한 multipart/form-data (0) | 2022.09.27 |
게시판 작업시 싱글톤 패턴을 이용하는 이유 (0) | 2022.09.27 |
(JSP2.1) 답변형 게시판 구현 - 테이블 생성과 Article 클래스 (0) | 2022.09.26 |
댓글