본문 바로가기
Programming/Java

JSP 파일 업로드

by 가우리언 2008. 12. 31.
728x90
반응형
개요
"최범균의 JSP 2.0 프로그래밍" 이라는 책의 내용중 파일업로드 하는 부분이 나오는데, 해당 라이브러리의 버전이 오래된 것이어서 테스트에 약간의 문제가 있었습니다. 이에 최신 버전으로 테스트할 수 있는 예제 소스를 정리해보았습니다. Java의 파일 업로드 모듈로 많이 사용되는 Apache commons fileUpload 의 최신 버전은 2008년 12월 31일 현재 1.2.1 입니다.또한, FileUpload 는 commons-io 1.3.2 에 의존적입니다.
예제

◎ fileUploadForm.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head><title>파일 업로드 폼</title></head>
<body>
<form action="processFileUpload.jsp" method="post" enctype="multipart/form-data">
파일1: <input type="file" name="file1" /><br/>
파일2: <input type="file" name="file2" /><br/>
파일3: <input type="file" name="file3" /><br/>
파라미터1: <input type="text" name="param1" /><br/>
파라미터2: <input type="text" name="param2" /><br/>
파라미터3: <input type="text" name="param3" /><br/>
<input type="submit" value="전송" />
</form>
</body>
</html>

◎ processFileUpload.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.BufferedInputStream" %>
<%@ page import="java.io.BufferedOutputStream" %>
<%@ page import="java.io.FileOutputStream" %>
<%@ page import="java.io.IOException" %>
<html>
<head><title>파일 업로드 처리</title></head>
<body>
<%
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if( isMultipart ) {
    File temporaryDir = new File("/tmp/");

    // Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // Set factory constraints
    factory.setSizeThreshold(1024*100);
    factory.setRepository(temporaryDir);
    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    // Set overall request size constraint
    upload.setSizeMax(1024*1024);
    // Parse the request
    List /* FileItem */ items = upload.parseRequest(request);

    // Process the uploaded items
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
        FileItem fileItem = (FileItem) iter.next();

        if (fileItem.isFormField()) {
            // processFormField(fileItem);
            out.println("폼 파라미터 : " + fileItem.getFieldName() + "=" + fileItem.getString("utf-8") + "<br/>");
        } else {
            // processUploadedFile(fileItem);
            out.println("파일 : " + fileItem.getFieldName() + "=<pre>" + fileItem.getString() + "</pre>(" + fileItem.getSize() + " bytes)<br/>");

            // 업로드한 파일이 존재하는 경우
            if( fileItem.getSize() > 0 ) {
                int idx = fileItem.getName().lastIndexOf("\\");
                if( idx == -1 ) {
                    idx = fileItem.getName().lastIndexOf("/");
                }
                String fileName = fileItem.getName().substring(idx + 1);

                try {
                    File uploadedFile = new File("/opt/project/jspstudy/web/chap16/data/", fileName);
                    fileItem.write(uploadedFile);
                } catch(IOException ex) {}
            }
        }
    }
} else {
    out.println("인코딩 타입이 multipart/form-data 가 아님.");
}
%>
</body>
</html>

저장하고자 하는 디렉토리는 바꾸어서 테스트해보시기 바랍니다.
이제 몇시간 후면 2009년이 되는군요. 내년도 건강하고 즐거운 한 해가 되시기 바랍니다.

728x90
반응형