ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파일 업로드
    Java/SpringBoot 2022. 8. 18. 17:12

    Http form을 서버에 보낼때 여러 항목을 보내기 위해서 `multipart/form-data` 형식을 사용한다.

     

    이를 통해 여러 파일과 폼의 내용을 함께 전송할 수 있다.

     

     

    서블릿과 파일 업로드1

    package hello.upload.controller;
    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 javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.Part;
    import java.io.IOException;
    import java.util.Collection;
    @Slf4j
    @Controller
    @RequestMapping("/servlet/v1")
    public class ServletUploadControllerV1 {
     @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";
     }
    }

     

    멀티파트 사용 옵션

    업로드 사이즈 제한

    spring.servlet.multipart.max-file-size=1MB     // 파일 1개당 최대 크기
    spring.servlet.multipart.max-request-size=10MB     //전송 최대 크기

     

     

    서블릿과 파일 업로드 2

     

    application.properties에서 파일 업로드 경로를 설정한다.

    file.dir = /Users/zxvc/ccxvz/file
    package hello.upload.controller;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.util.StreamUtils;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.Part;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.charset.StandardCharsets;
    import java.util.Collection;
    @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 {
     String itemName = request.getParameter("itemName");
     Collection<Part> parts = request.getParts();
     for (Part part : parts) {
     Collection<String> headerNames = part.getHeaderNames();
     for (String headerName : headerNames) {
    	part.getHeader(headerName));
     }
     InputStream inputStream = part.getInputStream();
     String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
     //파일에 저장하기
     if (StringUtils.hasText(part.getSubmittedFileName())) {
     String fullPath = fileDir + part.getSubmittedFileName();
     part.write(fullPath);
     }
     }
     return "upload-form";
     }
    }
    @Value("${file.dir}")
    private String fileDir;

    part.getSubmittedFileName() : 클라이언트가 전달한 파일명

    part.getInputStream(): Part의 전송 데이터를 읽을 수 있다.

    part.write(...): Part를 통해 전송된 데이터를 저장할 수 있다.

     

     

    파일 업로드 with Spring

     

    package hello.upload.controller;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    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 org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.MultipartFile;
    import javax.servlet.http.HttpServletRequest;
    import java.io.File;
    import java.io.IOException;
    @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.getOriginalFilename() : 업로드 파일 명

    file.transferTo(...) : 파일 저장

     

     

    'Java > SpringBoot' 카테고리의 다른 글

    API 예외 처리  (0) 2022.08.18
    타입 컨버터  (0) 2022.08.18
    예외 처리와 오류 페이지  (0) 2022.08.18
    의존성 주입 Dependency Injection. DI  (0) 2021.02.24
    [Thymeleaf] 문법 정리  (0) 2021.01.18
Designed by Tistory.