Back-End/JSP

3. JSP 페이지 처리 기법 - 02. 파일 업로드

parkes811 2024. 5. 31. 01:36

  • 파일 업로드의 개요

- 파일 업로드는 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것 입니다.

- 서버로 업로드할 수 있는 파일에는 텍스트 파일, 바이너리 파일, 이미지 파일, 문서 등 다양한 유형이 존재합니다.

 

  • 파일 업로드를 위한 JSP 페이지
<form action="JSP파일" method="POST" enctype="multipart/form-data">
	<input type="file" name="요청 파라미터 이름">
</form>

- 파일 업로드를 위해 form 태그에 인코딩 타입을 "multipart/form-data" 로 설정해야 합니다.

 

  • 파일 업로드 처리 방법

- 오픈 라이브러리 cos.jar 또는 commonsfileupload.jar를 사용해서 서버는 요청 파라미터를 분석하여 파일을 찾고 서버의 자원에 저장하는 과정을 거쳐야 합니다.

종류 특징 필요한 라이브러리
MultipartRequest 이용하기 가장 간단한 방법 cos.jar
아파치 API 이용하기 편리하고 강력한 API 제공 commons-fileupload.jar
commons-io.jar

 

  • MultipartRequest를 이용한 파일 업로드
  1. 웹 페이지에서 서버로 업로드되는 파일 자체만 다루는 클래스입니다.
  2. 웹 브라우저가 전송한 multipart/form-data 유형과 POST 방식의 요청 파라미터 등을 분석한 후 일반 데이터와 파일 데이터를 구분하여 파일 데이터에 접근합니다.
  3. MultipartRequest 클래스는 아래 배포 사이트에서 다운로드 받을 수 있습니다.
  4. http://www.servlets.com/cos/
 

Servlets.com | com.oreilly.servlet

 

www.servlets.com

<!-- MultipartRequest 클래스 생성 예제 -->
<%@ page import="com.oreilly.servlet.*" %>
<%@ page import="com.oreilly.multipart.*" %>
--- (생략) ---

MultipartRequest mulit = new MultipartRequest (request, "C:\\upload
                                                , 5*1024*1024, "utf-8"
                                                , new DefaultFileRenamePolicy())

 

- MultipartRequest 메소드

메소드 유형 설명
getContentType(String name) String 업로드된 파일의 콘텐츠 유형을 반환한다. 업로드된 파일이 없으면 null을 반환한다.
getParameter(String name) String 요청 파라미터 이름이 name인 값을 전달받는다.
getParameterNames() java.util.Enumeration 요청 파라미터 이름을 Enumeration 객체 타입으로 반환한다.
getFile(String name) java.io.File 서버에 업로드된 파일에 대한 파일 객체를 반환한다. 업로드된 파일이 없으면 null을 반환한다.
getFileNames() java.util.Enumeration 폼 페이지에 input 태그 내 type 속성 값이 file로 설정된 요청 파라미터의 이름을 반환한다.
getFilesystemName(String name) String 사용자가 설정하여 서버에 실제로 업로드된 파일명을 반환한다. 파일명이 중복되면 변경된 파일명을 반환한다.
getOriginalFileName(String name) String 사용자가 업로드한 실제 파일명을 반환한다. 파일명이 중복되면 변경 전의 파일명을 반환한다.

 

 

  • Commons-FileUpload를 이용한 파일 업로드
  1. 파일 업로드 패키지인 Commons-FileUpload는 서버의 메모리상에서 파일 처리가 가능하도록 지원하는 패키지입니다.
  2. 웹 브라우저에서 서버로 파일을 업로드하기 위해 필요한 오픈 라이브러리 commons-fileupload.jar, commons-io.jar 파일은 아래 배포 사이트에서 다운로드 받을 수 있습니다.
  3. http://commons.apache.org/downloads
 

Apache Commons – Apache Commons

Downloads Binary and source releases and links into the archives may be obtained by selecting a project below Release Announcements We recommend that you subscribe to the Apache Announce mailing list to be notified when releases are made by the Commons pro

commons.apache.org

 

- Commons-FileUpload 패키지로 파일 업로드하는 예제 코드

<%@ page contentType="text/html"; charset=utf-8 %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<html>
<body>
    <%
    	String fileUploadPath="C:\\upload"; // 실제 파일이 저장되는 경로
        
        // 1. Commons-FileUpload 패키지에 포함되어 있는 DiskFileUpload 객체 생성
        DiskFileUpload upload = new DiskFileUpload();
        
        // 2. multipart/form-data 유형의 요청 파라미터를 items에 가져오기
        List items = upload.praseRequest(request);
        
        Iterator params = items.iterator();
        
        // 3. FileItem 클래스의 메소드를 사용하여 요청 파라미터가 일반 데이터인지
        // 파일인지 확인하여 파일 업로드 진행
        while(params.hasNext()) {
        	FileItem item = (FileItem) param.next();
            
            if(item.isFormField()) {
            	String title = item.getString("UTF-8");
                out.println("<h3>" + title + "</h3>");
            } else {
            	String fileName= item.getName();
                fileName = fileName.subString(fileName.lasIndexOf("\\") + 1); 
                File file = new File(fileUploadPath + "/" + fileName);
                item.write(file);
                out.println("파일 이름 : " + fileName + "<br>");
            }
        }
     %>
</body>
</html>

 

- DiskFileUpload 클래스의 메소드

메소드  유형 설명
setRepositoryPath(String repoPath) void 업로드된 파일을 임시로 저장할 디렉터리를 설정한다.
setSizeMax(long sizeMax) void 최대 파일의 크기를 설정한다.
setSizeThreshold(int sizeThresold) void 메모리상에 저장할 최대 크기를 설정한다.
parseRequest(HttpServletRequest req) List<FileItem> multipart/form-data 유형의 요청 파라미터를 가져온다.

 

 

- FileItem 클래스의 메소드

메소드 유형 설명
isFormField() boolean 요청 파라미터가 파일이 아니라 일반 데이터인 경우 true를 반환한다.
getFieldName() String 요청 파라미터의 이름을 얻어온다.
getString() String 기본 문자 인코딩을 사용하여 요청 파라미터의 값을 얻어온다.
getString(String encoding) String 설정한 문자 인코딩을 사용하여 요청 파라미터의 값을 얻어온다.
getName() String 업로드된 파일(경로 포함)의 이름을 얻어온다.
getSize() long 업로드된 파일의 크기를 얻어온다.
get() byte[] 업로드된 파일을 바이트 배열로 얻어온다.
isInMemory() boolean 업로드된 파일이 메모리에 저장된 상태인 경우 true를 반환하고, 임시 디렉터리에 저장된 경우 false를 반환한다.
delete() void 파일과 관련된 자원을 삭제한다. 메모리상에 저장된 경우 할당된 메모리를 반환하고, 임시 파일로 저장된 경우 파일을 삭제한다.
write() void 파일과 관련된 자원을 저장한다.
getContentType() String 웹 브라우저가 전송하는 콘텐츠 유형을 반환하고, 정의되어 있지 않은 경우 null을 반환한다.