Spring Web Reactive Framework Multipart File Issue
After digging around I was able to find this test in the Spring WebFlux project:
So the part I was missing was @RequestPart
instead of @RequestBody
in the controller definition.
Final code looks something like this:
@RestController@RequestMapping("/images")public class ImageController { @Autowired private IImageService imageService; @PostMapping(value = "", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) Mono<ImageEntity> saveImage(@RequestPart("file") Mono<FilePart> part) throws Exception{ return part.flatMap(file -> imageService.saveImage(file)); }}
Actually the following solution seems to work with Netty
@PostMapping(path = "/test/{path}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = {MediaType.APPLICATION_JSON_VALUE}) @ResponseBody Mono<String> commandMultipart( @PathVariable("path") String path, @RequestPart("jsonDto") Mono<JsonDto> jsonDto, @RequestPart(value = "file",required = false) Mono<FilePart> file) { JsonDto dto = jsonDto.block(); }
Build.gradle
compile group: 'org.synchronoss.cloud', name: 'nio-multipart-parser', version: '1.1.0' compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.3' compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.3'
curl command in bash
echo '{"test":"1"}' > command.json && curl -H "Content-Type:multipart/form-data" -X POST http://localhost:8082/test/examplepath/ -F "command=@./command.json;type=application/json" -F "file=@test.bin" -vv
Troubleshooting steps
Ensure nio-multipart-parser is present by checking method
org.springframework.http.codec.support.ServerDefaultCodecsImpl#extendTypedReaders
You can check that nio-multipart-parser is used by placing breakpoint inside
org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader#canRead()
for single partorg.springframework.http.codec.multipart.MultipartHttpMessageReader#canRead
for multipart
One of the above methods should return true.
In some cases the solution is to update the Spring version greater than 2.1.1, after this you should check that in the dependencies that are not 'spring-webmvc' since this generates a conflict with 'spring-boot-starter-webflux'