[Spring] MultipartFile

manx·2022년 7월 3일
0

spring

목록 보기
18/22

인프런 '스프링 MVC 2편' - 김영한님의 강의 내용입니다.


HTTP multipart를 간편하게 처리하기 위해 스프링에서는 MultipartFile 인터페이스를 제공한다.

서블릿을 통한 multipart를 처리하는 코드

@Slf4j
@Controller
@RequestMapping("/servlet/v2")
public class ServletUploadControllerV2 {

    @Value("${file.dir}")
    private String fileDir;

    @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);

        for (Part part : parts) {
            log.info("==== PART ====");
            log.info("name={}", part.getName());
            Collection<String> headerNames = part.getHeaderNames();
            for (String headerName : headerNames) {
                log.info("header {}: {}", headerName, part.getHeader(headerName));
            }

            // 편의 메서드
            // Content-Disposition : filename
            log.info("submittedFilename={}", part.getSubmittedFileName());
            log.info("size={}", part.getSize());

            // 데이터 읽기
            InputStream inputStream = part.getInputStream();
            String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
            log.info("body = {}", body);

            // 파일에 저장하기
            // 파일이 아닐 경우 part.getSubmittedFileName=Null
            if (StringUtils.hasText(part.getSubmittedFileName())) {
                String fullPath = fileDir + part.getSubmittedFileName();
                log.info("파일 저장 fullPath={}", fullPath);
                part.write(fullPath);
            }
        }

        return "upload-form";
    }

HttpServletRequest를 사용해야 하고 InputStream을 통해 데이터를 읽어야 한다.


MultipartFile을 통한 처리

@Slf4j
@Controller
@RequestMapping("/spring")
public class SpringUploadController {

    @Value("${file.dir}")
    private String fileDir;

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

    @PostMapping("/upload")
    public String SaveFile(@RequestParam String itemName,
                           @RequestParam MultipartFile file, HttpServletRequest request) throws IOException {
        log.info("request={}", request);
        log.info("itemName={}", itemName);
        log.info("multipartFile={}", file);

        if (!file.isEmpty()) {
            String fullPath = fileDir + file.getOriginalFilename();
            log.info("파일 저장 fullPath={}", fullPath);
            file.transferTo(new File(fullPath));
        }

        return "upload-form";

    }
}

엄청 간단하게 처리할 수 있다.

  • file.transferTo() 파일 저장
  • file.getOriginalFilename() 업로드 파일 명

관련 설정

파일 업로드 사이즈 제한

  • spring.servlet.multipart.max-file-size=1MB (파일 하나의 사이즈)
  • spring.servlet.multipart.max-request-size=10MB (전체 파일 사이즈의 합)

multipart 처리 제한

  • spring.servlet.multipart.enabled=false (default = true)

Content-Disposition

공식문서

Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"

attachment : 반드시 다운로드 받아야 하며 브라우저는 'Save as'(새이름으로저장창을 보여주고 filename 파라미터들이 존재한다면 그 이름을 새이름으로 미리 채워줌)입니다.

profile
Back-end Developer

0개의 댓글