Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringWebFlux中在响应体中传输二进制数据_Java_Spring_Spring Mvc_Kotlin_Spring Webflux - Fatal编程技术网

Java 如何在SpringWebFlux中在响应体中传输二进制数据

Java 如何在SpringWebFlux中在响应体中传输二进制数据,java,spring,spring-mvc,kotlin,spring-webflux,Java,Spring,Spring Mvc,Kotlin,Spring Webflux,我正在使用SpringWebFlux制作一个项目 在过去,我曾使用StreamingResponseBody将响应流式传输回客户端,但我在WebFlux中找不到类似的方法 例如: import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; @GetMapping("/video") public StreamingResponseBody stream() { InputStre

我正在使用SpringWebFlux制作一个项目

在过去,我曾使用
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等效的功能?或者,我应该导入传统的SpringMVC并将其混合使用吗

编辑:到目前为止,我通过访问
服务器HttpResponse
(以下示例)来解决此问题。但我仍然想知道更好的解决方案

@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)
}
@GetMapping(“/video”)
fun stream2(响应:ServerHttpResponse):Mono{
val factory=response.bufferFactory()
val publisher=videoStream
.observeVideoParts()
.map{factory.wrap(it.bytes)}
返回响应。writeWith(发布者)
}

目前,我找到的最佳解决方案是返回一个
服务器httpresponse

由于
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)
}
fun服务器httpresponse.writeByteArray(字节:Flux):Mono{
val factory=this.bufferFactory()
val-dataBuffers=bytes.map{factory.wrap(it)}
返回此.writeWith(数据缓冲区)
}
然后一个
Flux
可以这样简单地编写:

@GetMapping("/video")
fun stream2(response: ServerHttpResponse): Mono<Void> {
    val videoParts: Flux<ByteArray> = ...
    return response.writeByteArrays(videoParts)
}
@GetMapping(“/video”)
fun stream2(响应:ServerHttpResponse):Mono{
val videoParts:Flux=。。。
返回响应。writeByteArrays(videoParts)
}

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

有点晚了。但是,在浏览Spring core和Webflux的最新文档时,我认为以下内容应该是可行的:

@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)
}
@GetMapping("/stream/{path}")
public Flux<DataBuffer> getVideo(
        @PathVariable("path") String path,
        ServerHttpResponse response
) {
    return DataBufferUtils.read(
            new FileSystemResource(path),
            response.bufferFactory(),
            512
    );
}
@GetMapping(“/stream/{path}”)
公共视频(
@PathVariable(“路径”)字符串路径,
ServerHttpResponse响应
) {
返回DataBufferUtils.read(
新文件系统资源(路径),
response.bufferFactory(),
512
);
}

@Frischling谢谢,但它不是重复的,当使用基于注释的控制器和请求映射时,使用
ServerResponse
不起作用。看:我的错,我没有时间测试这个方法。如果你投了反对票,请留下评论。也许我可以改进我的答案。