7. 파일업로드

Beat는 파일업로드를 위해 @MultipartRequest 어노테이션을 지원한다. 컨트롤러 클래스에 @MultipartRequest 어노테이션을 선언하면 Beat는 http요청을 Multipart/Form-data 형식으로 파싱하여 처리한다. 만약 클라이언트의 요청이 Multipart/Form-data형식이 아닐 경우에는 서블릿 예외를 발생한다.

다음과 같이 파일을 업로드할 폼을 작성한다.

  1. /WebRoot/uploadForm.htm
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <title>File Upload Submit Form</title>
        </head>

        <body>
  3.         <h2> Please Select File </h2>
            <form method="post" action="fileUpload.action" enctype="multipart/form-data">
                NAME : <input type="text" name="name" /> <br />
                FILE1 : <input type="file" name="file1" /> <br />
                FILE2 : <input type="file" name="file2" /> <br />
                <input type="submit" value="submit" />
            </form>
        </body>
    </html>

다음은 업로드를 처리할 컨트롤러를 작성한다. 파일 업로드를 위한 타입은 2가지를 제공하는데, 하나는 일반적인 java.io.File 타입이고, 하나는 파일을 래핑한 FormFile 타입이다. FormFile 타입은 파일이름과 크기, 컨텐츠 타입을 리턴하는 몇개의 헬퍼메서드로 구현되어 있다.

  1. /src/web/controller/FileUploadAction.java
  2. package web.controller;
  3. import java.io.File;
  4. import net.kldp.beat.annotation.Result;
  5. import net.kldp.beat.web.annotation.MultipartRequest;
  6. import net.kldp.beat.upload.FormFile;
  7. @MultipartRequest
  8. @Result(name = "success", value = "/uploadResut.jsp")
  9. public class FileUploadAction {
  10.     private String name;
  11.     private File file1;
  12.     private FormFile file2;
  13.     public void setName(String name) {
  14.         this.name = name;
  15.     }
  16.     public String getName() {
  17.         return name;
  18.     }
  19.     public void setFile1(File file1) {
  20.         this.file1 = file1;
  21.     }
  22.     public String getFile1Name() {
  23.         return file1.getAbsolutePath();
  24.     }
  25.     public void setFile2(FormFile file2) {
  26.         this.file2 = file2
  27.     }
  28.     public String getFile2Name() {
  29.         this.file2.getName();
  30.     }
  31. }

다음은 uploadResult.jsp 페이지를 만들 차례이다.

  1. /WebRoot/uploadResult.jsp
  2. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>File Upload Result</title>
      </head>
     
      <body>
        <h2>File Upload Success.</h2>
  3.     Your  name is : ${name} <br />
  4.     File1 name is : ${file1Name} <br />
  5.     File2 name is : ${file2Name} <br />
  6.   </body>
    </html>

이로써 간단히 업로드를 테스트 할 수 있다.

@MultipartRequest 어노테이션은 size 속성을 제공하는데 size 속성을 설정하면 최대 업로드 컨텐츠를 지정할 수 있다.(MB단위) 또한 errorKey와 errorMessage 타입을 설정하면 파일 업로드중에 에러가 발생했을 경우 에러 객체에 키와 메세지를 설정한다. 이를 위해서는 컨트롤러가 ValidationAware를 구현해야 하며 ValidationAware를 구현하지 않았을 경우에 Multipart인터셉터는 파일 업로드 에러에 대해 기본적으로 서블릿 예외를 발생시킨다.

< 이전 | 다음 >