스프링 웹 MVC-23.ResponseEntity(핸들러 메소드)
핸들러 메소드 14부: ResponseEntity
파일 리소스를 읽어오는 방법
- 스프링 ResourceLoader 사용하기
파일 다운로드 응답 헤더에 설정할 내용
- Content-Disposition: 사용자가 해당 파일을 받을 때 사용할 파일 이름
- Content-Type: 어떤 파일인가
- Content-Length: 얼마나 큰 파일인가
파일의 종류(미디어 타입) 알아내는 방법
- http://tika.apache.org/
ResponseEntity
- 응답 상태 코드
- 응답 헤더
- 응답 본문
tika-core 라이브러리
<!-- https://mvnrepository.com/artifact/org.apache.tika/tika-core -->
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.23</version>
</dependency>
@Autowired
private ResourceLoader resourceLoader;
// @ResponseBody
// Resurce 로 리턴하는 경우
@GetMapping("/file/{filename}")
// @ResponseBody 안써도 됨. ResponseEntity 자체가 응답이기 때문
public ResponseEntity<Resource> fileDownload(@PathVariable String filename) throws IOException {
System.out.println(filename);
Resource resource = resourceLoader.getResource("classpath:" + filename);
File file = resource.getFile();
Tika tika = new Tika(); // 빈 등록해서 사용
String mediaType = tika.detect(file);
System.out.println("mediaType : " + mediaType);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+resource.getFilename())
//.header(HttpHeaders.CONTENT_TYPE, "image/jpg") // 미디어타입을 알아야 하니까 라이브러리 사용
.header(HttpHeaders.CONTENT_TYPE, mediaType)
.header(HttpHeaders.CONTENT_LENGTH, file.length() + "")
.body(resource);
}
참고 https://spring.io/guides/gs/uploading-files/ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition https://www.baeldung.com/java-file-mime-type