【发布时间】:2020-08-21 03:16:09
【问题描述】:
我尝试使用类 ResourceRegion 使用 Spring 和反应器流式传输文件。
我有这个方法:
public Mono<ServerResponse> getPartialVideoById(ServerRequest request) {
Long idVideo = Long.valueOf(request.pathVariable("idVideo"));
HttpHeaders requestHeaders = request.headers().asHttpHeaders();
Optional<UrlResource> video = this.videoService.getUrlResourceById(idVideo);
Optional<ResourceRegion> resourceRegion = video.map(v -> {
try {
return this.videoService.getRegion(v, requestHeaders);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
});
return ServerResponse.status(HttpStatus.PARTIAL_CONTENT)
.contentType(MediaTypeFactory.getMediaType(video.get()).orElse(MediaType.APPLICATION_OCTET_STREAM))
.contentLength(resourceRegion.get().getCount())
.headers(headers -> headers.setCacheControl(CacheControl.noCache()))
.body(Mono.just(resourceRegion.get()), ResourceRegion.class).flatMap(response -> {
if (response.headers().getContentLength() == 0) {
return Mono.error(new ResourceNotFound());
}
return Mono.just(response);
});
}
我的终点是这样的:
@Bean
RouterFunction<ServerResponse> videoEndPoint(VideoRouteHandler videoRouteHandler) {
return route(GET("/video/{idVideo}"), videoRouteHandler::getPartialVideoById)
.filter((request, next) -> next.handle(request)
.onErrorResume(ErrorHandler::handleError));
}
所有都是在SpringBoot的嵌入式Netty下启动的,但是当我尝试调用该api时,我不得不出现以下错误:
org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'video/x-msvideo' not supported for bodyType=org.springframework.core.io.support.ResourceRegion
我尝试了不同类型的文件(avi、mkv、mp4、....还有 pdf....),但内容类型仍然存在问题。
有什么想法吗?
【问题讨论】:
标签: java spring spring-boot reactor