웹개발/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어노테이션 생략이 가능하다.