스프링 MVC 활용(21) : 핸들러 메소드 13부 - MultipartFile

de_sj_awa·2021년 7월 4일
0
post-custom-banner

21. 핸들러 메소드 13부 - MultipartFile

MultipartFile

  • 파일 업로드시 사용하는 메소드 아규먼트
  • MultipartResolver 빈이 설정 되어 있어야 사용할 수 있다. (스프링 부트 자동 설정이 해 줌)
  • POST multipart/form-data 요청에 들어있는 파일을 참조할 수 있다.
  • List<MultipartFile> 아큐먼트로 여러 파일을 참조할 수도 있다.

파일 업로드 관련 스프링 부트 설정

  • MultipartAutoConfiguration
  • MultipartProperties (Application.properties)

파일 업로드 폼

<form method="POST" enctype="multipart/form-data" action="#" th:action="@{/file}"> File: <input type="file" name="file"/> 
<input type="submit" value="Upload"/> 
</form>

파일 업로드 처리 핸들러

@PostMapping("/file") 
public String uploadFile(@RequestParam MultipartFile file, 
RedirectAttributes attributes) { 
    String message = file.getOriginalFilename() + " is uploaded."; 
    System.out.println(message); 
    attributes.addFlashAttribute("message", message); 
    return "redirect:/events/list"; 
}

메시지 출력

<div th:if="${message}"> 
	<h2 th:text="${message}"/> 
</div>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload</title>
</head>
<body>

<div th:if="${message}">
    <h2 th:text="${message}"/>
</div>

<form method="POST" enctype="multipart/form-data" action="#" th:action="@{/file}"> File: <input type="file" name="file"/>
  <input type="submit" value="Upload"/>
</form>
</body>
</html>
@Controller
public class FileController {

    @GetMapping("/file")
    public String fileUploadForm(Model model){
        return "files/index";
    }

    @PostMapping("/file")
    public String fileUpload(@RequestParam MultipartFile file,
                             RedirectAttributes attributes){
        // save
        System.out.println("file name : " + file.getName());
        System.out.println("file original name : " + file.getOriginalFilename());
        String message = file.getOriginalFilename() + " is uploaded";
        attributes.addFlashAttribute("message", message);
        return "redirect:/file";
    }
}

테스트 코드

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class FileControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void fileUploadTest() throws Exception{
        MockMultipartFile file = new MockMultipartFile("file", "test.txt", "text/plain", "hello file".getBytes());
        this.mockMvc.perform(multipart("/file").file(file))
            .andDo(print())
            .andExpect(status().is3xxRedirection());
    }
}

참고

profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글