본문 바로가기
Spring Framework/이론

[스프링프레임워크] 파일 업로드

by 컴공맨 2021. 5. 3.

파일전송

  • 파일 전송을 위해서는 form을 post 형식으로 해야하고 enctype을 multipart/form-data로 설정해야 한다.
  • <form action="file_upload" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit" value="OK"> </form>
  • 이때 Controller에서는 해당 파라미터를 MultipartFile로 받아와야한다.
    • enctype="multipart/form-data" 요청을 메소드 파라미터와 연관시킬 수 있다.
      • 이때, 넘어오는 파라미터의 명과 메소드의 파라미터의 명이 같아야한다.
    public String doRegist(@ModelAttribute Book book, @RequestPart(required = false) MultipartFile file)
    • 그리고 업로드된 파일을 저장하기 위해 rsLoader와 Resource를 사용하여 실제로 저장할 폴더의 경로를 구해와 파일을 전송받아 저장한다.
    import java.io.IOException;
    
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.ResourceLoader;
    
    @Autowired
    ResourceLoader rsLoader;
    
    @RequestMapping("/file_upload")
    public String fileUpload(MultipartFile myfile) throws IllegalStateException, IOException {
        //    System.out.println(myfile.getSize());
        Resource resource = rsLoader.getResource("resources/upload");
        myfile.transferTo(
            new File(resource.getFile().getCanonicalPath() + 
                     "/" 
                     + myfile.getOriginalFilename()));
        return "";
    }
  • 또한 servlet-context.xml에 CommonsMultipartResolver를 빈으로 생성해야 한다.
  • <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </beans:bean>
  • pom.xml에 commons-fileupload dependency를 추가해야한다.
  • <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
  • 보통 dispatcher servlet이 검사하지않게 설정한 resoureces 폴더 밑에 upload 폴더를 만들고 저장한다.