使用 Spring WebClient 将文件作为输入流上传

问题描述 投票:0回答:1

我正在使用 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);
java spring-webflux inputstream fileinputstream spring-webclient
1个回答
0
投票

您收到的内部服务器错误实际上与 WebClient 无关,但您的代码中还有另外两个问题:

  1. Content-Disposition 标头中的字符串连接,因为 text.txt 周围有双引号。
  2. 第二是你没有构建MultiPartBodyBuilder,并且
    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

© www.soinside.com 2019 - 2024. All rights reserved.