서블릿과 파일업로드(2)

SHByun·2023년 2월 6일
0

1. 서블릿과 파일업로드(2)

1. 파일 업로드 절대 경로

  • 파일 업로드를 위해서는 실제 파일이 저장되는 경로가 필요하다.
  • Application.properties

2. Controller

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

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

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

    @PostMapping("/upload")
    public String saveFileV2(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));
            }
            // 편의 메서드
            // content0disposition; 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);

            inputStream.close();
        }

        return "upload-form";
    }
}
  • inputStream.close()를 해줘야 delete exception이 발생하지 않는다.


3. 파일 저장하기

@PostMapping("/upload")
public String saveFileV2(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));
        }
        // 편의 메서드
        // content0disposition; 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);

        // 파일에 저장하기
        if (StringUtils.hasText(part.getSubmittedFileName())) {
            String fullPath = fireDir + part.getSubmittedFileName();
            log.info("파일 저장 fullPath = {}", fullPath);
            part.write(fullPath);
        }
        inputStream.close();
    }

    return "upload-form";
}
  • 파일 저장하기 부분 추가

4. 정리

  • 이를 통해 application.properties에서 설정한 file.dir 값을 주입한다.

5. 참고

  • 큰 용량의 파일을 업로드를 테스트 할 때는 로그가 너무 많이 남아서 다음 옵션을 끄는 것이 좋다. logging.level.org.apache.coyote.http11=debug
  • log.info("body={}", body);도 파일의 바이너리 데이터를 모두 출력하므로 끄는 것이 좋다.

출처

인프런 강의 - 김영한
스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard

profile
안녕하세요

0개의 댓글