gpt4 book ai didi

java - 如何在 Spring WebFlux 的响应正文中流式传输二进制数据

转载 作者:IT老高 更新时间:2023-10-28 13:46:02 26 4
gpt4 key购买 nike

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

过去我曾使用 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)
}

我仍然愿意接受其他解决方案。

关于java - 如何在 Spring WebFlux 的响应正文中流式传输二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47954356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com