-
파일 업로드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