You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Spring WebClient解析返回的multipart/form-data响应体?

WebClient解析multipart/form-data响应实现方案

BodyExtractors.toMultipartData() 并不限制仅在Controller层使用,完全可以直接用于WebClient的multipart/form-data格式响应解析,无需单独开发自定义实现。

基础使用示例

Spring 5.3及以上版本无需额外配置,直接在WebClient响应处理阶段调用即可:

// 非阻塞场景下可替换block()为subscribe、flatMap等响应式操作符
MultiValueMap<String, Part> multipartResult = webClient.post()
        .uri("请求接口地址")
        .retrieve()
        .body(BodyExtractors.toMultipartData())
        .block();

注意:如果目标接口返回的Content-Type响应头未携带合法的boundary参数,会导致解析失败,需要确认服务端返回的响应头符合multipart格式规范,或手动在WebClient的响应处理阶段修正Content-Type值。

低版本兼容配置

如果使用的Spring版本低于5.3,或者默认配置下出现multipart格式识别失败的问题,可手动注册Multipart消息读取器到WebClient的编解码器配置中:

WebClient webClient = WebClient.builder()
        .codecs(codecConfigurer -> {
            // 注册multipart格式专属消息读取器
            DefaultPartHttpMessageReader partReader = new DefaultPartHttpMessageReader();
            MultipartHttpMessageReader multipartReader = new MultipartHttpMessageReader(partReader);
            codecConfigurer.customCodecs().register(multipartReader);
        })
        .build();

单个Part内容读取示例

解析得到的MultiValueMap<String, Part>中存储了所有multipart分段内容,可按需读取对应字段:

  • 读取普通文本类型的表单字段:
Part textPart = multipartResult.getFirst("表单字段名");
String textValue = DataBufferUtils.join(textPart.content())
        .map(buffer -> buffer.toString(StandardCharsets.UTF_8))
        .block();
  • 读取文件类型的分段内容:
Part filePart = multipartResult.getFirst("文件字段名");
// 示例:将文件内容写入本地磁盘
Path savePath = Paths.get("本地存储路径");
DataBufferUtils.write(filePart.content(), savePath, StandardOpenOption.CREATE)
        .block();

内容的提问来源于stack exchange,提问作者kemenov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:27:00