목차
Spring Boot - StreamingResponseBody
Spring Boot - ResourceRegion
Spring Boot - 파일 다운로드 서비스 구현하기
Spring Boot - 파일 업로드 서비스 구현하기
Spring Boot - Resource 추상화
Spring Boot - MultipartFile 에서 발생하는 예외 처리
Spring Boot - MultipartFile 를 이용한 파일 업로드
Spring Boot - Part 객체를 이용한 파일 업로드
Http Range Request
서버에서 클라이언트로 HTTP 메시지 중 일부만 전송할 수 있도록 허용하는 기술
대용량의 미디어 파일, 파일 전송 중 일시 정지 및 다시 시작이 가능하다
Client 가 Range Header 를 통해 특정 리소스의 일부를 요청하면 서버가 그 부분만 전송하는 방식으로 동작한다.
Server 가 Range Request 를 지원하면 Response Http Header 에 Content-Range 가 존재한다.
HTTP Range 요청에 대한 정상 응답 코드로는 PARTIAL_CONTENT(206) 을 반환한다.
Range 요청에 대한 응답 값이 Body 에 담겨져 있다.
Spring Boot - ResourceRegion
HttpRange 는 Range Header 정보를 담든 객체다. Request Header 로부터 정보를 얻어올 수 있다.
ResourceRegion 는 전달 받은 Resource 객체 로부터 Range 범위 만큼 나눠 가져오는 객체다.
@RestController@Slf4jpublic class VideoController { @GetMapping(value = "/video") public ResponseEntity<ResourceRegion> streamVideo(@RequestHeader HttpHeaders headers) throws IOException { UrlResource video = new UrlResource("file:/Users/dongwoo-yang/spring-file/mysong.mp4"); ResourceRegion resourceRegion; final long size = 1000000L; long contentLength = video.contentLength(); Optional<HttpRange> optional = headers.getRange().stream().findFirst(); HttpRange httpRange; if (optional.isPresent()) { httpRange = optional.get(); long start = httpRange.getRangeStart(contentLength); long end = httpRange.getRangeEnd(contentLength); long rangeLength = Long.min(size, end - start + 1); resourceRegion = new ResourceRegion(video, start, rangeLength); } else { long rangeLength = Long.min(size, contentLength); resourceRegion = new ResourceRegion(video, 0, rangeLength); } return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT) .contentType(MediaTypeFactory.getMediaType(video).orElse(MediaType.APPLICATION_OCTET_STREAM)) .body(resourceRegion); }}
서버에서 전송해주는 Resource Size 가 1 MB(1000000) 로 잡혀 있어 1 MB 씩 부분적으로 응답받는 것을 확인할 수 있다.