Java/SpringBoot

파일 업로드

Choi G.H 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(...) : 파일 저장

 

 

반응형