기타/JSP

JSP 파일 처리

inanJeong 2020. 6. 9. 11:47

http://commons.apache.org/proper/commons-fileupload/

 


아파치 Commons FileUpload 패키지

아파치 Commons FileUpload 패키지는 아파치 Commons IO 패치지에 종속되기 때문에 두개의 패키지 모두 필요하다. 웹 애플리케이션에서 파일 올리기는 RFC 1867에 기반하여 HTTP 요청을 하고 이를 서버에서 처리한다. HTTP는 POST 메소드를 통하여 서버로 전달되고, "multipart/form-data"라는 콘텐츠 형태로 전달된다.

 

maven dependency  -> pom.xml

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

 

파일 올리기

1. 우선 HTTP 요청이 파일 올리기 요청인지 확인해야한다.

ServletFileUpload 클래스

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

 

2. 요청된 파일 처리를 위한 초기화

DiskFileItemFactory, ServletFileUpload 클래스

 

// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();

// Set factory constraints
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Set overall request size constraint
upload.setSizeMax(yourMaxRequestSize);

// Parse the request
List<FileItem> items = upload.parseRequest(request);

 

3. 요청 파싱 및 폼 필드/파일 구분 처리

 

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

    if (item.isFormField()) {
        processFormField(item);
    } else {
        processUploadedFile(item);
    }
}

 

파일 내리기

서버에 있는 파일을 클라이언트쪽으로 가져와야함

-> HttpServletResponse 객체를 통하여 내려받아야함

 

ServeltOutputStream: 이진 데이터를 클라이언트로 보내는 출력 스트림 제공

HTTP 응답 헤더 설정: 이진 데이터 형태로 수신되는 파일을 처리하기 위해서는 HTTP 응답 헤더 설정이 필요하다.

 

파일 전송 관련 헤더

  • Content-Type: RFC 2045  -> 인터넷 미디어 형태를 알림
//Syntax of the Content-Type Header Field

content := "Content-Type" ":" type "/" subtype
                *(";" parameter)
                ; Matching of media type and subtype
                ; is ALWAYS case-insensitive.

     type := discrete-type / composite-type

     discrete-type := "text" / "image" / "audio" / "video" /
                      "application" / extension-token

     composite-type := "message" / "multipart" / extension-token

     extension-token := ietf-token / x-token
     
     
  • Content-Disposition: RFC 2183   -> 파일 처리 방식을 알림
disposition := "Content-Disposition" ":"
                    disposition-type
                    *(";" disposition-parm)

     disposition-type := "inline"
                       / "attachment"
                       / extension-token
                       ; values are not case-sensitive

     disposition-parm := filename-parm
                       / creation-date-parm
                       / modification-date-parm
                       / read-date-parm
                       / size-parm
                       / parameter

     filename-parm := "filename" "=" value

     creation-date-parm := "creation-date" "=" quoted-date-time

     modification-date-parm := "modification-date" "=" quoted-date-time

     read-date-parm := "read-date" "=" quoted-date-time

     size-parm := "size" "=" 1*DIGIT

     quoted-date-time := quoted-string
                      ; contents MUST be an RFC 822 `date-time'
                      ; numeric timezones (+HHMM or -HHMM) MUST be used