티스토리 뷰

시작 전 

logging.level.org.apache.coyote.http11=debug

 

application.properties에 해당 코드를 넣으면 http메세지를 모두 확인 할 수 있다.

 

package hello.upload.controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.Part;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.IOException;
import java.util.Collection;

@Slf4j
@Controller
@RequestMapping("/servlet/v1")
public class ServletUploadV1 {

    @GetMapping("/upload")
    public String newFile(){
        return "upload-form";
    }

    @PostMapping("/upload")
    public String saveFileV1(HttpServletRequest request) throws ServletException, IOException {
        log.info("request = {}", request);

        String itemName = request.getParameter("itemName");
        log.info("itemName = {}", itemName);

        Collection<Part> parts = request.getParts();
        log.info("parts = {}", parts);

        return "upload-form";
    }
}

준비코드

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
</head>
<body>
<div class="container">
    <div class="py-5 text-center"> <h2>상품 등록 폼</h2>
    </div>
    <h4 class="mb-3">상품 입력</h4>
    <form th:action method="post" enctype="multipart/form-data">
        <ul>
            <li>상품명 <input type="text" name="itemName"></li>
            <li>파일<input type="file" name="file" ></li> </ul>
        <input type="submit"/>
    </form>
</div> <!-- /container -->
</body>
</html>

 

 

상품 a와 파일을 보내봤다.

 

 

로그를 찍어봤을 때 parts 부분에 두개가 찍혔다. 넘어온 인풋의 내용들이다. 이것을 이용해서 파일을 꺼낼 수 있다.

 

멀티파트에는 용량제한을 둘 수도 있다.

 

spring.servlet.multipart.max-file-size=1MB
  spring.servlet.multipart.max-request-size=10MB

 

spring.servlet.multipart.enabled 끄기

spring.servlet.multipart.enabled = false

 

이걸 하면 파츠로 들어오는 값이 안나오며, request 구현체인 requestFacade가 찍히게 된다.

 

 

한마디로 멀티파트와 관련 된 처리를 하지 말라고 명령하는 것이다.

 

spring.servlet.multipart.enabled 끄기

spring.servlet.multipart.enabled=false

결과 로그

  request=org.apache.catalina.connector.RequestFacade@xxx
  itemName=null
  parts=[]

멀티파트는 일반적인 폼 요청인 application/x-www-form-urlencoded 보다 훨씬 복잡하다. spring.servlet.multipart.enabled 옵션을 끄면 서블릿 컨테이너는 멀티파트와 관련된 처리를 하지 않는다.
그래서 결과 로그를 보면 request.getParameter("itemName") , request.getParts() 의 결과가 비어있다.

spring.servlet.multipart.enabled 켜기 spring.servlet.multipart.enabled=true (기본 true)

이 옵션을 켜면 스프링 부트는 서블릿 컨테이너에게 멀티파트 데이터를 처리하라고 설정한다. 참고로 기본 값은 true 이다.

  request=org.springframework.web.multipart.support.StandardMultipartHttpServletR
  equest
  itemName=Spring
  parts=[ApplicationPart1, ApplicationPart2]

request.getParameter("itemName") 의 결과도 잘 출력되고, request.getParts() 에도 요청한 두 가지 멀티파트의 부분 데이터가 포함된 것을 확인할 수 있다. 이 옵션을 켜면 복잡한 멀티파트 요청을 처리해서 사용할 수 있게 제공한다.

로그를 보면 HttpServletRequest 객체가 RequestFacade StandardMultipartHttpServletRequest 로 변한 것을 확인할 수 있다.

spring.servlet.multipart.enabled 끄기

spring.servlet.multipart.enabled=false

결과 로그

  request=org.apache.catalina.connector.RequestFacade@xxx
  itemName=null
  parts=[]

멀티파트는 일반적인 폼 요청인 application/x-www-form-urlencoded 보다 훨씬 복잡하다. spring.servlet.multipart.enabled 옵션을 끄면 서블릿 컨테이너는 멀티파트와 관련된 처리를 하지 않는다.
그래서 결과 로그를 보면 request.getParameter("itemName") , request.getParts() 의 결과가 비어있다.

spring.servlet.multipart.enabled 켜기 spring.servlet.multipart.enabled=true (기본 true)

이 옵션을 켜면 스프링 부트는 서블릿 컨테이너에게 멀티파트 데이터를 처리하라고 설정한다. 참고로 기본 값은 true 이다.

  request=org.springframework.web.multipart.support.StandardMultipartHttpServletR
  equest
  itemName=Spring
  parts=[ApplicationPart1, ApplicationPart2]

request.getParameter("itemName") 의 결과도 잘 출력되고, request.getParts() 에도 요청한 두 가지 멀티파트의 부분 데이터가 포함된 것을 확인할 수 있다. 이 옵션을 켜면 복잡한 멀티파트 요청을 처리해서 사용할 수 있게 제공한다.

로그를 보면 HttpServletRequest 객체가 RequestFacade StandardMultipartHttpServletRequest 로 변한 것을 확인할 수 있다.

 

참고

spring.servlet.multipart.enabled 옵션을 켜면 스프링의 DispatcherServlet 에서 멀티파트 리졸버( MultipartResolver )를 실행한다.
멀티파트 리졸버는 멀티파트 요청인 경우 서블릿 컨테이너가 전달하는 일반적인 HttpServletRequest MultipartHttpServletRequest 로 변환해서 반환한다.

MultipartHttpServletRequest HttpServletRequest 의 자식 인터페이스이고, 멀티파트와 관련된 추가 기능을 제공한다.

스프링이 제공하는 기본 멀티파트 리졸버는 MultipartHttpServletRequest 인터페이스를 구현한 StandardMultipartHttpServletRequest 를 반환한다.
이제 컨트롤러에서 HttpServletRequest 대신에 MultipartHttpServletRequest 를 주입받을 수 있는데, 이것을 사용하면 멀티파트와 관련된 여러가지 처리를 편리하게 할 수 있다. 그런데 이후 강의에서 설명할 MultipartFile 이라는 것을 사용하는 것이 더 편하기 때문에 MultipartHttpServletRequest 를 잘 사용하지는 않는다. 더 자세한 내용은 MultipartResolver 를 검색해보자.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함