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
    );
}