How to stream binary data in a response body in Spring WebFlux
For now, the best solution that I have found is to return a ServerHttpResponse
.
Since ServerHttpResponse
only allows to write DataBuffer
objects but not ByteArray
objects, I made an extension function that wraps them before writing:
fun ServerHttpResponse.writeByteArrays(bytes: Flux<ByteArray>): Mono<Void> {
val factory = this.bufferFactory()
val dataBuffers = bytes.map { factory.wrap(it) }
return this.writeWith(dataBuffers)
}
Then a Flux<ByteArray>
can simply be written like this:
@GetMapping("/video")
fun stream2(response: ServerHttpResponse): Mono<Void> {
val videoParts: Flux<ByteArray> = ...
return response.writeByteArrays(videoParts)
}
I am still open to other solutions.
A little bit late. However, scanning the recent documentation of Spring core and Webflux, I think the following should work:
@GetMapping("/stream/{path}")
public Flux<DataBuffer> getVideo(
@PathVariable("path") String path,
ServerHttpResponse response
) {
return DataBufferUtils.read(
new FileSystemResource(path),
response.bufferFactory(),
512
);
}