반응형

MultipartFile

파일 업로드를 할때 사용하는 핸들러 메소드 argument


  • Spring MVC의 경우에는 MultipartResolver 빈이 설정되어있어야한다.

    // example MultipartResolver bean
    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(100000);
        return multipartResolver;
    }
  • Spring Boot에서는 자동으로 설정이 된다. => 따라서 properties에서 최대 요청 가능 용량같은 옵션을 설정할 수 있다.

  • POST요청을 보낼 때 enctype="multipart/form-data"가 있어야 파일을 참조할 수 있다.

  • List을 사용해 여러 파일을 참조할 수 있다.


    파일 업로드 구현

  • 파일 업로드 form 만들기

    • files/index.html
    <form method="POST" enctype="multipart/form-data" action="#" th:action="@{/file}">
        File: <input type="file" name="file"/>
        <input type="submit" value="Upload"/>
    </form>
    • FileController.java
    @Controller
    public class FileController {
    
        @GetMapping("/file")
        public String fileUploadForm() {
            return "files/index";
        }
    
    }

  • POST로 오는 파일 업로드 요청 처리하기

    • FileController.java
    @Controller
    public class FileController {
    
        @GetMapping("/file")
        public String fileUploadForm() {
            return "files/index";
        }
    
        @PostMapping("/file")
        public String fileUpload(@RequestParam MultipartFile file,
                                 RedirectAttributes attributes) {
            // save...
    
            System.out.println(file.getName());        // getName : html에서 넘어오는 name ('file')
            System.out.println(file.getOriginalFilename());
                                                                                          // getOriginalFilename : 원래 파일명
    
            String message = file.getOriginalFilename() + " is uploaded";
    
              // 파일 업로드가 되었다는 message를 'files/index.html'에서 띄워준다.
            attributes.addFlashAttribute("message", message);
            return "redirect:/file";
        }
    }
    • message를 뛰우기 위한 html 코드
    <div th:if="${message}">
        <h2 th:text="${message}"/>
    </div>

    Test 코드 만들기

    @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());
        }
    }
반응형

BELATED ARTICLES

more