Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stream upload 'POST' in Spring WebClient

I am uploading streams of (raw bytes) data using HTTP posts using WebClient:

    final byte[] rawData = IOUtils.toByteArray(sourceInputStream);
    webClient.post()
             .uri(uri)
             .contentType(MediaType.APPLICATION_OCTET_STREAM)
             .bodyValue(rawData)
             .exchange()...

I am concerned there is a potentially a lot of memory used given sometimes these objects can be quite big (~200Mb) so would like to read directly from the InputStream and upload as a stream.

I tried:

 bodyValue(BodyInserters.fromResource(new InputStreamResource(inputStream))) 

but got exception Content type 'application/octet-stream' not supported for bodyType=org.springframework.web.reactive.function.BodyInserters

So I then tried removing the header but the data is then corrupted.

Is there a way to stream the data without passing through the in memory 'buffer' rawData[]?

Thanks

like image 577
user1016765 Avatar asked Apr 29 '20 16:04

user1016765


1 Answers

Your first try was almost correct, however you need to use body(...) instead of bodyValue(...):

body(BodyInserters.fromResource(new InputStreamResource(inputStream)))

This is because bodyValue(...) wraps your resource inserter in a value inserter, which will then try to serialize the resource inserter itself and fail with the error you received.

like image 53
jkemming Avatar answered Sep 19 '22 08:09

jkemming