JSP 파일 업로드

박승현·2022년 4월 27일

JSP

목록 보기
6/11

파일 업로드의 개요

파일 업로드(file upload)는 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것을 말한다. 서버로 업로드할 수 있는 파일에는 텍스트 파일, 바이너리 파일, 이미지 파일, 문서 등 다양한 유형이 있다. 웹 브라우저에서 서버로 파일을 전송하기 위해 JSP 페이지에 폼 태그를 사용하고, 전송된 파일을 서버에 저장하기 위해 오픈 라이브러리를 이용해야 한다.

파일 업로드를 위한 JSP 페이지

웹 브라우저에서 서버로 파일을 전송하기 위해 JSP 페이지에 폼 태그를 작성할 때 몇 가지 중요한 규칙을 따라야 한다.

<form action="JSP 파일" method="POST" enctype="multipart/form-data">
  <input type="file" name="요청 파라미터 이름">
</form>
  1. form 태그의 method 속성은 반드시 POST 방식으로 설정해야 한다.
  2. form 태그의 enctype 속성은 반드시 multipart/form-data로 설정해야 한다.
  3. form 태그의 action 속성은 파일 업로드를 처리할 JSP 파일로 설정해야 한다.
  4. 파일 업로드를 위해 input 태그의 type 속성을 file로 설정해야 한다. 만약 여러 파일을 업로드하려면 2개 이상의 input 태그를 사용하고 name 속성에 서로 다른 값을 설정한다.

[파일 업로드를 위한 폼 태그 사용 예]

<body>
	<form method="post" enctype="multipart/form-data" action="process.jsp">
    	<p> 제목 : <input type="text" name="title">
        <p> 파일 : <input type="file" name="fileName">
        <p> <input type="submit" value="submit'>
    </form>
</body>

파일 업로드 처리 방법

웹 브라우저에서 서버로 파일을 업로드하면 서버로 요청 파라미터를 분석하여 파일을 찾고 서버의 자원(파일 저장 폴더)에 저장하는 과정을 거친다. 이러한 파일 업로드의 처리는 단순한 자바 코드로 작성하여 처리할 수 없어 오픈 라이브러리인 cos.jarcommons-fileupload.jar를 사용해야 한다.

[파일 업로드 처리 방법]

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

MultipartRequest를 이용한 파일 업로드

MultipartRequest는 웹 페이지에서 서버로 업로드되는 파일 자체만 다루는 클래스이다. 웹 브라우저가 전송한 multipart/form-data 유형과 POST 방식의 요청 파라미터 등을 분석한 후 일반 데이터와 파일 데이터를 구분하여 파일 데이터에 접근한다. 또한 한글 인코딩 값을 얻기 쉽고, 서버의 파일 저장 폴더에 동일한 파일명이 있으면 파일명을 자동으로 변경한다.

MultipartRequest 클래스는 cos(com.oreilly.servlet) 패키지에 포함되어 있는 파일 업로드 컴포넌트로, 오픈 라이브러리 cos.jar를 다음 배포 사이트에서 직접 다운로드해서 사용한다. 그리고 JSP 페이지에 page 디렉티브 태그의 import 속성을 사용하여 패키지 comm.oreilly.servlet.*을 설정해야 한다.

MultipartRequest 클래스 생성

MultipartRequest 클래스는 다양한 생성자를 제공한다. 그중에서 한글 인코딩 값을 쉡게 얻을 수 있고, 업로드되는 파일이 서버에 저장된 기존 파일과 중복될 때 자동으로 변경해주는 생성자의 형식은 다음과 같다.

MultipartRequest(javax.servlet.http.HttpServletRequest request,
				java.lang.String saveDirectory,
                int maxPostSize,
                java.lang.String encoding,
                FileRenamePolice police)

[MultipartRequest] 생성자의 매개변수

매개변수설정
requestRequest 내장 객체를 설정한다.
saveDirectory서버의 파일 저장 경로를 설정한다.
maxPostSize파일의 최대 크기(바이트 단위)를 설정한다. 최대 크기를 초과하면 IOException이 발생한다.
encoding인코딩 유형을 설정한다.
policy파일명 변경 정책을 설정한다. saveDirectory에 파일명이 중복되는 경우 덮어쓰기 여부를 설정하며, 설정하지 않으면 덮어쓴다.

[MultiRequest 클래스 생성 예]

<%@ page import="com.oreilly.servlet.&"%>
<%@ page import="com.oreilly.servlet.multipart.*"%>
....(생략)...
MultipartRequest multi = new MultipartRequest(request, "C:\\uploan", 5*1024*1024, "utf-8", new DefaultFileRenamePolicy())

MultipartRequest 메소드

웹 브라우저에서 전송한 multipart/form-data 유형의 요청 파라미터를 쉽게 읽어오고 파일을 업로드할 수 있도록 MultipartRequest 클래스에는 다양한 메소드가 있다. 웹 브라우저에서 전송되는 요청 파라미터 중 일반 데이터는 getParameter() 메소드로 값을 받을 수 있지만 파일의 경우 getFileNames()메소드를 이용하여 데이터를 받는다.

[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(Stirng name)String사용자가 설정하여 서버에 실제로 업로드된 파일명을 반환한다. 파일명이 중복되면 변경된 파일명을 반환한다.
getOriginalFileName(Stirng name)String사용자가 업로드한 실제 파일명을 반환한다. 파일명이 중복되면 변경 전의 파일명을 반환한다.

[요청 파라미터 정보 출력하기]

<%@ page contentType="text/html;charset=utf-8"%>
<%@page import="com.oreilly.servlet.*"%>
<%@page import="com.oreilly.servlet.Multipart.*"%>
<%@page import="java.util.*" %>
<%@page import="java.io.*" %>
<%
	MultipartRequest multi = new MultipartRequest(request, "D:\\upload", 5*1024*1024, "utf-8", new DefaultFileRenamePolicy());
    
    String title = multi.getParameter("title");
    out.println("<h3>" + title + "</h3>");
    
    Enumeration files = multi.getFileNames();
    String name = (String) files.nextElement();
    
    String filename = multi.getFilesystemName(name);
    String original = multi.getOriginalFileName(name);
    
    out.println("실제 파일 이름 : " + original + "<br>");
    out.println("저장 파일 이름 : " + filename + "<br>");
%>

Commons-FileUpload를 이용한 파일 업로드

파일 업로드 패키지인 Commons-FileUpload는 서버의 메모리상에서 파일 처리가 가능하도록 지원한다. 이 패키지는 Commons-io 패키지를 바탕으로 작성되었기 때문에 웹 브라우저에서 서버로 파일을 업로드하기 위해 오픈 라이브러리 commons-fileupload.jar, commons-io.jar 파일을 다음 배포 사이트에서 직접 다운로드해서 사용한다. 그리고 JSP 페이지에 page 디렉티브 태그의 import 속성을 사용하여 패키지 org.apache.commons.fileupload.*를 설정해야 한다.

<%@page import="org.apache.commons.fileupload.*"%>
<%@page import="java.io.*" %>
<%@page import="java.util.*" %>
<%
	String fileUploadPath = "D:\\upload";
	DiskFileUpload upload = new DiskFileUpload();
	List items = upload.parseRequest(request);
    
    while(params.hasNext()){
    	FileItem fileItem = (FileItem)params.next();
        if(item.isFormField()){
        	String title = item.getString("UTF-8");
            out.println("<h3>" + title + "</h3>");
        } else{
        	String fileName = item.getName();
            fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
            File file = new File(fileUploadPath + "/" + fileName);
            item.write(file);
            out.println("파일 이름 : " + fileName + "<br>");
        }
    }
%>
  1. Commons-FileUpload를 이용하여 파일을 업로드하려면 먼저 Commons-FileUpload 패키지에 포함되어 있는 DiskFileUpload 객체를 생성한다.
  2. 생성된 객체를 통해 DiskFileUpload 클래스가 제공하는 메소드를 사용하여 웹 브라우저가 전송한 multipart/form-data 유형의 요청 파라미터를 가져온다.
  3. FileItem 클래스의 메소드를 사용하여 요청 파라미터가 일반 데이터인지 파일인지 분석 및 처리하여 파일을 업로드한다.

[DiskFileUpload 클래스의 메소드]

메소드유형설명
setRepositoryPath(String repositoryPath)void업로드된 파일을 임시로 저장할 디렉터리를 설정한다.
setSizeMax(long sizeMax)void최대 파일의 크기를 설정한다.
setSizeThreshold(int sizeThreshold)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을 반환한다.
profile
그냥 해보자 안되더라도 해보자 끝까지 해보자

0개의 댓글