0

0

WebClient如何上传XML文件 Spring 5的响应式文件上传

月夜之吻

月夜之吻

发布时间:2026-01-23 10:15:51

|

712人浏览过

|

来源于php中文网

原创

webclient上传xml文件必须显式设置content-type为application/xml或text/xml,否则服务端可能因类型不匹配(如text/plain)导致解析失败或415错误;本地文件推荐用multipartbodybuilder流式上传并保留文件名,字符串上传则需配合contenttype方法指定类型且确保utf-8编码一致。

webclient如何上传xml文件 spring 5的响应式文件上传

WebClient 上传 XML 文件必须设置 Content-Type

Spring 5 的 WebClient 默认不会自动推断 XML 文件的 Content-Type,如果只用 bodyValue(fileContent),服务端很可能收到 text/plain 或空类型,导致解析失败。必须显式指定为 application/xmltext/xml

  • XML 字符串体上传:用 bodyValue + contentType
  • 本地 .xml 文件上传:推荐转为 DataBuffer 流式写入,配合 MultipartBodyBuilder
  • 后端是 Spring WebFlux 的 @RequestBody String xml 接收,Content-Type: application/xml 是硬性要求

用 MultipartBodyBuilder 上传 XML 文件(推荐)

这是最贴近真实“文件上传”语义的方式,尤其当后端期望接收 MultipartFile 或 multipart/form-data 格式时。注意:XML 文件名需保留(如 data.xml),否则部分服务端框架无法识别内容类型。

SuperCms在线订餐系统
SuperCms在线订餐系统

模板采用响应式设计,自动适应手机,电脑及平板显示;满足单一店铺外卖需求。功能:1.菜单分类管理2.菜品管理:菜品增加,删除,修改3.订单管理4.友情链接管理5.数据库备份6.文章模块:如:促销活动,帮助中心7.单页模块:如:企业信息,关于我们更强大的功能在开发中……安装方法:上传到网站根目录,运行http://www.***.com/install 自动

下载
Path xmlPath = Paths.get("src/main/resources/test.xml");
String filename = xmlPath.getFileName().toString();

byte[] xmlBytes = Files.readAllBytes(xmlPath);

MultipartBodyBuilder builder = new MultipartBodyBuilder();
builder.part("file", new ByteArrayResource(xmlBytes), MediaType.APPLICATION_XML)
       .filename(filename);

WebClient.create()
    .post()
    .uri("https://api.example.com/upload")
    .bodyValue(builder.build())
    .header(HttpHeaders.CONTENT_TYPE, builder.build().getHeaders().getContentType().toString())
    .retrieve()
    .bodyToMono(String.class)
    .block();

直接传 XML 字符串(不走 multipart)

适用于后端接受裸 XML body(如 @RequestBody DocumentString)。此时无需 multipart 封装,但必须确保:

  • Content-Type 明确设为 application/xml
  • XML 字符串本身格式合法(UTF-8 编码、无 BOM、根元素闭合)
  • 避免用 bodyValue(xmlString) 后再手动加 header —— 应该用 bodyValue 配合 contentType 方法,否则 header 可能被覆盖
String xmlPayload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><user><id>123</id></user>";
WebClient.create()
    .post()
    .uri("https://api.example.com/submit")
    .contentType(MediaType.APPLICATION_XML)
    .bodyValue(xmlPayload)
    .retrieve()
    .bodyToMono(String.class)
    .block();

常见 415 错误和字符编码陷阱

返回 415 Unsupported Media Type 几乎全是 Content-Type 不匹配导致;而中文乱码或解析异常,则大概率是编码未对齐。Spring WebFlux 默认按 UTF-8 解析,但如果你的 XML 声明写了 encoding="GBK",又没做相应适配,就会出错。

  • XML 文件读取时统一用 Files.readAllBytes(path)字节安全),不要用 Files.readString() 再转回 bytes
  • 若 XML 带声明如 <?xml version="1.0" encoding="UTF-8"?>,确保实际字节流确实是 UTF-8 编码
  • WebClient 不会重写 XML 声明,所以声明里的 encoding 和传输层 encoding 必须一致
multipart 边界生成、buffer 复用、响应式背压处理这些细节在简单上传中容易被忽略,但一旦并发量上来或文件变大,就可能卡在 DataBufferFactory 分配环节。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

156

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1945

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1168

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Rust 教程
Rust 教程

共28课时 | 6.8万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号