이번 시간에는 파일 업로드 요청을 처리하는 핸들러를 작성하는 방법을 알아보도록 하겠습니다.
1. MultipartFile
1.1 MultipartFile 란?
MultipartFile
이란 사용자가 업로드한 File을 핸들러에서 손쉽게 다룰 수 있도록 도와주는 Handler의 매개변수중 하나입니다.
*MultipartFile 매개변수를 사용하기 위해서는 MultipartResolver Bean이 등록되어있어야 합니다. 이전 포스팅에서 다루었던 https://galid1.tistory.com/528에서 말씀드렸듯이, DispatcherServlet은 처음 초기화 되는 과정에서 Web서비스를 위해 필요한 기본적인 Bean들을 개발자가 설정한 Bean을 등록하거나, 설정한 것이 없는 경우 기본전략에 의해 자동으로 등록을 합니다. 하지만 MultipartResolver
는 SpringMVC
에서 기본으로 등록해주지 않습니다.
하지만 SpringBoot에서는 위와 같이 MultipartAutoConfiguration
클래스에서 MultipartResolver Bean이 등록되어있지 않는 경우 자동으로 Bean을 등록해줍니다. 따라서 SpringBoot
를 사용한다면 별도의 설정없이 MultipartFile
매개변수를 사용할 수 있습니다.
1.2 MultipartFile 예제
사용자가 파일을 업로드 했을때, 업로드한 파일의 이름을 출력해주는 예제를 작성해보겠습니다.
xxxxxxxxxx
public class SampleController {
"/file") (
public String getFile(Model model){
return "/files/file";
}
"/file") (
public String postFile( MultipartFile file, RedirectAttributes redirectAttributes) throws IOException{
// file을 저장소에 저장하는 코드
String fileName = file.getOriginalFilename();
File destinationFile = new File("C:/attatchments/" + fileName);
destinationfile.getParentFile().mkdir();
file.transferTo(destinationFile); // 이 메소드에 의해 저장 경로에 실질적으로 File이 생성됨
// upload response 메시지
String message = fileName + " is Uploaded.";
redirectAttributes.addFlashAttribute("message", message);
return "redirect:/file";
}
}
getFile()
핸들러의 경우 /file
로 오는 get 요청을 받아들이며, upload를 위한 html을 사용자에게 전달해줍니다. 또한 postFile()
핸들러에서 FlashAttributes
를 통해 전달하는 데이터를 자동으로 Model에 담아서 view에서 사용할 수 있도록 합니다.
postFile()
핸들러의 경우는 사용자가 업로드한 데이터를 MultipartFile
매개변수에 맵핑합니다. 이때 upload 요청이 parameter를 통해 넘어오기 때문에 @ReqeustParam
을 이용했습니다. 또 업로드한 File의 이름을 이용해 문자열을 만들어 FlashAttributes
에 담아 /file
로 다시 redirect 했습니다. 실제로는 해당 file을 저장소에 저장하는 로직이 필요할 것입니다.
다음의 경로에 file.html을 생성합니다.
<body>
<div th:if="${message}">
<h3 th:text="${message}"/>
</div>
<form action="#" method="POST" enctype="multipart/form-data" th:action="@{/file}">
<input type="file" name="file"> </br>
<input type="submit" value="업로드">
</form>
</body>
file.html은 message에 해당하는 modelAttribute가 존재하는 경우(file을 업로드한 경우) <h3>태그를 통해 해당 message를 html에 뿌려줍니다. <input type="file name="file"> 에서 name은 당연히 handler에서 맵핑하는 @RequestParam의 value와 같아야 합니다.
http://localhost:8080/file로 접속한 뒤 파일선택
버튼을 클릭하여 파일을 선택한 뒤 업로드
버튼을 클릭하여 file 업로드 요청을 보냅니다.
파일 이름이 출력됩니다.
1.3 PostMan으로 FileUpload 테스팅
PostMan을 통해서 file Upload를 테스팅하기 위해서는 위와 같이 설정하여 테스팅 하면 됩니다.
METHOD : POST
TYPE : form-data
KEY : handler에서 받아들이는 parameter key
VALUE : 업로드할 file
form-data에 file을 업로드 하기 위해서는 key를 입력하는 칸의 오른쪽의 key type을 file로 우선 변경합니다.
그렇게 하면 자동으로 value에 file을 업로드할 수 있는 버튼이 생겨납니다.