본문 바로가기
Dev/Java

FileUpload API를 이용한 파일 업로드 구현

by vellahw 2022. 9. 27.

 

 

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) 메소드로 한 번에 업로드 할 수 있는 전체 파일의 크기 및 각 파일별로 업로드 할 수 있는 파일의 크기를 설정할 수 있다.

 

 

댓글