웹개발/Spring

Spring MVC(MultipartFile와ResponseEntity)

간타타 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어노테이션 생략이 가능하다.