ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC(MultipartFile와ResponseEntity)
    웹개발/Spring 2020. 7. 30. 19:59

    이 내용은 인프런의 스프링 웹 MVC강좌를 참고하여 만들었습니다.

     

    - 파일 업로드시 사용한다

     

    - MultipartResolver빈이 설정이 되어 있어야 사용이 가능(스프링 부트가 자동적으로 설정)

     

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <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>

     

    해당 html파일은 multipart/form-data타입으로 요청을 보내줌

     

     

     

    <dependency>
                <groupId>org.apache.tika</groupId>
                <artifactId>tika-core</artifactId>
                <version>1.24.1</version>
     </dependency>

     

    @Controller
    public class FileController {
    
        @Autowired
        private ResourceLoader resourceLoader;
    
        @PostMapping("/file")
        public String fileUpload(@RequestParam MultipartFile file,
                                 RedirectAttributes attributes){
            //save
            System.out.println("file name : " +file.getName());
            System.out.println("file origin name : " +file.getOriginalFilename());
            String message = file.getOriginalFilename() + "is uploaded";
            attributes.addFlashAttribute("message",message);
    
            return "redirect:/file";
        }
    
        @GetMapping("/file")
        public String fileUploadFrom(Model model){
            return "files/index";
        }
    
        @GetMapping("/file/{filename}")
        @ResponseBody
        public ResponseEntity<Resource> downloadFile(@PathVariable String filename) throws
                IOException {
            Resource resource = resourceLoader.getResource("classpath:" + filename);
            File file = resource.getFile();
    
            Tika tika = new Tika();
            String mediaType = tika.detect(file);
    
    
    
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachement; filename=\"" + resource.getFilename() + "\"")
                    .header(HttpHeaders.CONTENT_TYPE,mediaType)
                    .header(HttpHeaders.CONTENT_LENGTH,file.length() + "")
                    .body(resource)
                    ;
        }
    }

     

    -컨트롤러에서 @RequestParam으로 파라미터를 받아와 파일을 처리 할 수 있다.

     

    -다운로드 부분에서는 리턴값을 ResponseEntity를 이용하여 요청의 헤더와 Body안에 리소스를 첨가하여 반환 할 수 있다.

     

    -미디어 타입을 헤더 부분에 첨가하기 위하여 Tika라는 의존성을 설치하여 타입을 알아내고 헤더에 첨가 할 수 있다.

     

    -ResponseEntity같은 경우에는 @ResponseBody어노테이션 생략이 가능하다.

     

     

Designed by Tistory.