2008-12-31

JSP 파일 업로드

[개요]
"최범균의 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년이 되는군요. 내년도 건강하고 즐거운 한 해가 되시기 바랍니다.

2008-12-08

.NET을 다시 알다

실버라이트를 연구하려다 보니, WPF에 대해 알고 싶어지고, 크게는 .NET에 대해 알고 싶어지더군요. 지난 주말에는 C#을 다시 한번 공부해보았습니다. WPF 와 실버라이트2 책도 주문해 놓고요.

문 득, 다른 OS에서 돌아가는 .NET 을 찾아보게 되었습니다. 원래 .NET이라는것이 Java 처럼 모든 OS에서 돌아가는 VM 으로 발전하려고 했더니까요. 더 나아가서 여러 언어도 통합이 되어 있지요. 이런 개념으로 Perl 측에서도 Parrot 이라는 것을 만들고 있는 중이죠.

아무튼, 예전에 한번 보고 말았던 Mono 프로젝트 사이트를 다시 방문해봤습니다. 그다지 발전이 없어보였던 Mono 가 .NET 2.0 까지 지원되고 있더라구요. 거기에 monodevelop 이라고 하는 훌륭한 IDE까지 제공하고 있습니다. 제 Debian Linux 에서도 패키지를 찾아보니 모두 있더군요. 당장 설치해보고, 초간단 Hello World 프로그램까지 만들어 실행해보니, 완벽하게 실행이 됩니다. Mono 에서는 C#.NET, VB.NET, ADO.NET 이 지원되는 듯 했습니다. 여기에 추후 .NET 3.X 까지 지원된다면 더욱더 훌륭하리라 봅니다.

이로써 .NET 에 대해서 다시 보게 되었습니다. 잘 하면 Java 를 능가하는 멋진 시스템이 될 것 같습니다. 점점 .NET의 매력에 빠져버리는군요. 책이 빨리 도착하면 좋겠습니다. *^^*