繁体   English   中英

如何在 Spring WebFlux 的响应体中流式传输二进制数据

[英]How to stream binary data in a response body in Spring WebFlux

我正在使用 Spring WebFlux 制作一个项目。

过去,我使用StreamingResponseBody将响应StreamingResponseBody式传输回客户端,但在 WebFlux 中找不到等效项。

例子:

import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

@GetMapping("/video")
public StreamingResponseBody stream() {
    InputStream videoStream = ...
    StreamingResponseBody res = (os) -> { IOUtils.copy(videoStream, os); }
    return res;
}

是否有等效于 WebFlux 的StreamingResponseBody 或者,我应该导入传统的 Spring MVC 并混合它们吗?

编辑:到目前为止,我是通过访问ServerHttpResponse (下面的示例)来解决它的。 但我仍然想知道更好的解决方案。

@GetMapping("/video")
fun stream2(response: ServerHttpResponse): Mono<Void> {
    val factory = response.bufferFactory()
    val publisher = videoStream
            .observeVideoParts()
            .map { factory.wrap(it.bytes) }
    return response.writeWith(publisher)
}

目前,我发现的最佳解决方案是返回ServerHttpResponse

由于ServerHttpResponse只允许写入DataBuffer对象而不允许写入ByteArray对象,因此我制作了一个扩展函数,在写入之前将它们包装起来:

fun ServerHttpResponse.writeByteArrays(bytes: Flux<ByteArray>): Mono<Void> {
    val factory = this.bufferFactory()
    val dataBuffers = bytes.map { factory.wrap(it) }
    return this.writeWith(dataBuffers)
}

然后Flux<ByteArray>可以简单地写成这样:

@GetMapping("/video")
fun stream2(response: ServerHttpResponse): Mono<Void> {
    val videoParts: Flux<ByteArray> = ...
    return response.writeByteArrays(videoParts)
}

我仍然对其他解决方案持开放态度。

有点晚了。 但是,扫描 Spring core 和 Webflux 的最新文档,我认为以下应该有效:

@GetMapping("/stream/{path}")
public Flux<DataBuffer> getVideo(
        @PathVariable("path") String path,
        ServerHttpResponse response
) {
    return DataBufferUtils.read(
            new FileSystemResource(path),
            response.bufferFactory(),
            512
    );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM