React上传XML文件 Ant Design的upload组件如何自定义请求
发布时间 - 2026-01-28 00:00:00 点击率:次Ant Design Upload 组件默认使用 XMLHttpRequest 且不走 axios/fetch,必须通过 customRequest 手动实现上传逻辑以支持 Authorization、timeout、onUploadProgress 及 application/xml 类型;需直接传 file 对象而非 FormData,并注意编码、响应类型与组件卸载防护。
Ant Design Upload 组件默认不走 axios 或 fetch,而是用原生 XMLHttpRequest
这是关键前提:即使你项目里全局用了 axios,Upload 的 customRequest 不显式覆盖,它就自己发请求,且无法携带 Authorization 头、无法设 timeout、无法监听 onUploadProgress —— 更别说上传 XML 文件时需要指定 Content-Type: application/xml。
必须用 customRequest 替换默认上传逻辑
XML 文件本质是二进制 Blob,但服务端通常要求明确的 Content-Type 和原始文本结构。直接传 file 对象给 FormData 会自动加 boundary,不适合纯 XML 场景。
-
customRequest函数接收{ file, onSuccess, onError, onProgress }四个参数,必须手动调用它们来控制状态 - 不要用
FormData.append('file', file)—— 这会让服务端收到 multipart 包裹体,而多数 XML 接口期望裸 XML 字符串或原始字节流 - 推荐读取为
text后用Blob构造新对象,或直接用file(如果服务端接受原始application/xml) -
onProgress只在XMLHttpRequest.upload上可用,fetch原生不支持上传进度,所以这里仍建议用XMLHttpRequest
customRequest: ({ file, onSuccess, onError, onProgress }) => {
const xhr = new XMLHttpRequest();
xhr.upload.onprogress = (e) => {
if (e.lengthComputable) {
onProgress({ percent: (e.loaded / e.total) * 100 });
}
};
xhr.onload = () => {
if (xhr.status >= 200 && xhr.status < 300) {
onSucces

s(xhr.response);
} else {
onError(new Error(Upload failed: ${xhr.status} ${xhr.statusText}));
}
};xhr.onerror = () => onError(new Error('Network error'));
xhr.open('POST', '/api/upload-xml');
xhr.setRequestHeader('Content-Type', 'application/xml');
// 如果需要鉴权
// xhr.setRequestHeader('Authorization', Bearer ${token});
xhr.send(file);
}
XML 文件内容校验和编码问题要提前处理
浏览器读取 XML 文件时,file.text() 会按 UTF-8 解码;但如果文件含 BOM 或声明了 ,直接上传可能被服务端拒绝。稳妥做法是跳过解析,原样上传字节流 —— 这正是 xhr.send(file) 的优势。
- 避免先
file.text().then(str => new Blob([str], ...)),这会二次编码,可能破坏原始声明 - 若必须预览或校验内容,用
new FileReader().readAsText(file, 'UTF-8')并捕获异常,但上传仍用原始file对象 -
后端若返回非 JSON 响应(比如纯 XML 成功响应),注意
xhr.responseType设置(如'document'或''),否则xhr.response可能为空
React 18 *意 customRequest 的异步稳定性
如果上传中组件卸载,onSuccess 或 onError 调用时可能触发 “Cannot update a component while rendering” 报错。需加简单清理机制:
- 在
customRequest内部声明一个isMounted = true,xhr.onload前判断 - 或用
useRef存储挂载状态,在useEffect(() => () => { isMounted.current = false }, []) - 更轻量的做法:只确保
onSuccess/onError是函数再调用,Ant Design 内部已做基础防护,但业务侧状态更新仍需自行守卫
XML 上传真正麻烦的不是格式本身,而是服务端对 Content-Type、编码、响应体类型的隐式约定 —— 动手前先 curl -v -H "Content-Type: application/xml" --data-binary @test.xml 验证通路,比调半天 React 逻辑更省时间。
# react
# js
# json
# 编码
# 浏览器
# app
# 字节
# axios
# 后端
# curl
# ai
# ios
# while
# xml
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
如何快速重置建站主机并恢复默认配置?
LinuxCD持续部署教程_自动发布与回滚机制
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
在线制作视频网站免费,都有哪些好的动漫网站?
如何在云虚拟主机上快速搭建个人网站?
Python并发异常传播_错误处理解析【教程】
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Laravel如何生成API文档?(Swagger/OpenAPI教程)
香港服务器如何优化才能显著提升网站加载速度?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
如何用AWS免费套餐快速搭建高效网站?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Python高阶函数应用_函数作为参数说明【指导】
如何用5美元大硬盘VPS安全高效搭建个人网站?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel中的withCount方法怎么高效统计关联模型数量
网站制作免费,什么网站能看正片电影?
Laravel如何为API生成Swagger或OpenAPI文档
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
油猴 教程,油猴搜脚本为什么会网页无法显示?
Python结构化数据采集_字段抽取解析【教程】
如何快速查询域名建站关键信息?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel如何发送系统通知?(Notification渠道示例)
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
如何续费美橙建站之星域名及服务?
lovemo网页版地址 lovemo官网手机登录
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
如何在景安服务器上快速搭建个人网站?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何撰写建站申请书?关键要点有哪些?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
网易LOFTER官网链接 老福特网页版登录地址
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
JavaScript数据类型有哪些_如何准确判断一个变量的类型


