우선, ResourceRegion은 Spring에서 제공하는 클래스입니다.
이전엔 StreamingResponseBody 를 이용하여, 동영상을 제공해보았는데
해당방법으로 구현하다보니, outputstream 의 offset 제어 등
생각보다 눈에 보이지않고, 제어해줘야 할 부분이 많았습니다.
동영상 재생은 Partial Content 즉, 부분컨텐츠를 클라이언트에게 제공해야하는데
이에 최적화되어있고 편하게 만들어진 클래스로써, ResourceRegion가 있습니다.
@RequestMapping(value = "/getFileWithRange.do", method = {RequestMethod.GET})
public ResponseEntity<ResourceRegion> getFileWithRange(@RequestHeader HttpHeaders httpHeaders, @RequestParam(value = "fileIdx") int fileIdx, HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> articleFileInfo = articleRepository.getArticleFileInfo(fileIdx);
if (articleFileInfo == null) {
return ResponseEntity.notFound().build();
} else {
FileUrlResource fileUrlResource = null;
try {
fileUrlResource = new FileUrlResource(fileSavePath + articleFileInfo.get("file_path").toString());
if (!fileUrlResource.isFile()) {
return ResponseEntity.notFound()
.build();
} else {
final long chunkSize = 5000000L;
long contentLength = fileUrlResource.contentLength();
ResourceRegion region;
if (httpHeaders.getRange().isEmpty()) {
region = new ResourceRegion(fileUrlResource, 0, Long.min(chunkSize, contentLength));
} else {
HttpRange httpRange = httpHeaders.getRange().stream().findFirst().get();
long start = httpRange.getRangeStart(contentLength);
long end = httpRange.getRangeEnd(contentLength);
long rangeLength = Long.min(chunkSize, end - start + 1);
region = new ResourceRegion(fileUrlResource, start, rangeLength);
}
return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)
.contentType(MediaTypeFactory.getMediaType(fileUrlResource).orElse(MediaType.APPLICATION_OCTET_STREAM))
.body(region);
}
} catch (IOException e) {
log.error(e.toString());
throw new RuntimeException(e);
}
}
}
저는 위와같이, 코딩을 하였으며 DB를 사용하지 않고 로컬에 있는 파일을 사용하여 테스트 하신다면
FileUrlResource 생성자의 Argument로 실 경로를 문자열로 주시면 됩니다.
동영상을 재생하자, 위의 이미지처럼 크롬 디버그 창에서 정상적인 네트워크 활동이 일어났음을 확인하였습니다.
[SpringBoot] Spring Boot DevTools란? (0) | 2023.01.26 |
---|---|
[SpringBoot] ClassPathResource 이용시 주의사항 (0) | 2022.12.23 |
[SpringBoot] FFmpeg 를 통한 영상 다루기 chapter.01 (0) | 2022.12.07 |
[Eureka Server] Netflix Eureka Server 소스 (0) | 2022.08.24 |
[Logback] Logback configuration error detected (0) | 2022.08.16 |