我正在使用 webflux springboot 应用程序。我有一个 API,它接受 FilePart 作为输入,然后将其转换为输入流,因为我使用 Tika 库进行文件类型检查,然后使用 webclient 将此文件上传到 API,我从服务器收到 500 内部服务器错误
MultipartBodyBuilder builder = new MultipartBodyBuilder();
builder.part("file", new InputStreamResource(inputStream)).header("Content-Disposition",
"form-data; name=file; filename="test.txt");
return webClient
.post()
.uri("https://example.com/file")
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(multipartBody))
.retrieve()
.bodyToMono(String.class);
但是如果我跳过将文件转换为输入流,则网络客户端可以工作
return webClient.post()
.uri("https://example.com/file")
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData("file", filePart))
.retrieve()
.bodyToMono(String.class);
您收到的内部服务器错误实际上与 WebClient 无关,但您的代码中还有另外两个问题:
multipartBody
中使用的BodyInserters.fromMultipartData(multipartBody)
没有初始化。工作代码:
MultipartBodyBuilder builder = new MultipartBodyBuilder();
builder.part("file", new InputStreamResource(inputStream))
.header("Content-Disposition", "form-data; name=\"file\";
filename=\"test.txt\"");
//building MultipartBodyBuilder and assigning it to multipartBody
MultiValueMap<String, HttpEntity<?>> multipartBody = builder.build();
return webClient`enter code here`
.post()
.uri("https://example.com/file")
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(multipartBody))
.retrieve()
.bodyToMono(String.class);
请注意在 Content-Disposition 标头字符串中的
\"
和 "
周围使用 file
而不是 test.txt
。