相关疑难解决方法(0)

Spring Web Reactive客户端

我正在尝试使用Spring Reactive WebClient将文件上传到Spring控制器。控制器非常简单,看起来像这样:

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<String> uploadFile(
        @RequestParam("multipartFile") MultipartFile multipartFile,
        @RequestParam Map<String, Object> entityRequest
        ) {
    entityRequest.entrySet().forEach(System.out::println);
    System.out.println(multipartFile);
    return ResponseEntity.ok("OK");
}
Run Code Online (Sandbox Code Playgroud)

当我将此控制器与cURL一起使用时,一切正常

curl -X POST http://localhost:8080/upload -H 'content-type: multipart/form-data;' -F fileName=test.txt -F randomKey=randomValue -F multipartFile=@document.pdf
Run Code Online (Sandbox Code Playgroud)

multipartFile转到正确的参数,其他参数转到Map。

当我尝试从WebClient执行相同操作时,我陷入了困境。我的代码如下所示:

    WebClient client = WebClient.builder().baseUrl("http://localhost:8080").build();

    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    map.set("multipartFile", new ByteArrayResource(Files.readAllBytes(Paths.get("/path/to/my/document.pdf"))));
    map.set("fileName", "test.txt");
    map.set("randomKey", "randomValue");
    String result = client.post()
            .uri("/upload")
            .contentType(MediaType.MULTIPART_FORM_DATA)
            .syncBody(map)
            .exchange()
            .flatMap(response -> response.bodyToMono(String.class))
            .flux()
            .blockFirst();
    System.out.println("RESULT: " + result);
Run Code Online (Sandbox Code Playgroud)

这将导致400错误

{
  "timestamp":1510228507230,
  "status":400, …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc spring-boot spring-webflux

6
推荐指数
1
解决办法
2224
查看次数

标签 统计

java ×1

spring ×1

spring-boot ×1

spring-mvc ×1

spring-webflux ×1