hoony's web study

728x90
반응형

1. ResourceRegion

 

우선, ResourceRegion은 Spring에서 제공하는 클래스입니다.

 

이전엔 StreamingResponseBody 를 이용하여, 동영상을 제공해보았는데

 

해당방법으로 구현하다보니, outputstream 의 offset 제어 등

 

생각보다 눈에 보이지않고, 제어해줘야 할 부분이 많았습니다.

 

동영상 재생은 Partial Content 즉, 부분컨텐츠를 클라이언트에게 제공해야하는데

 

이에 최적화되어있고 편하게 만들어진 클래스로써, ResourceRegion가 있습니다.

 

2. 예제

 

@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로 실 경로를 문자열로 주시면 됩니다.

 

 

동영상을 재생하자, 위의 이미지처럼 크롬 디버그 창에서 정상적인 네트워크 활동이 일어났음을 확인하였습니다.

728x90

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading