上传参数:
let promise = new Promise((resolve, reject) => {
let defaultOptions = {
url: '',
header:{},
name: options.name || 'fileName',
filePath: options.filePath || '',
formData: options.data || {},
- 发布:2026-01-31 22:46
- 更新:2026-01-31 22:47
- 阅读:18
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: windows10专业版
HBuilderX类型: 正式
HBuilderX版本号: 4.87
手机系统: Android
手机系统版本号: Android 12
手机厂商: 华为
手机机型: BLK-AL00
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
示例代码:
操作步骤:
目前开发环境无法复现。
目前开发环境无法复现。
预期结果:
确保服务器能够100%解析上传文件。
确保服务器能够100%解析上传文件。
实际结果:
暂无
暂无
bug描述:
一、背景:
1、用Uniapp.uploadFile上传图片,用户直接调用相机,拍照后,直接调用上传,每天大约2万张照片上传。
2、通过Uniapp.uploadFile上传文件,指定filePath+name方式。
二、现象:
少数用户偶发性出现上传照片提示,没有选择文件,经过日志排查,发现是服务器端context.Request.Files.Count=0,每天大约会出现几十次这样的请求错误。
三、日志分析(服务器收集):
当客户端Content-Type出现以下情况时:
1、IPhone出现:Content-Type: multipart/form-data; boundary=WABoundary+0E17C2DC2EA70744WA,Content-Length: xxxx
2、Android出现:Content-Type: multipart/form-data; boundary=------3Yz6Bc,Content-Length: xxxx
时会出现服务器端无法解析上传文件导致context.Request.Files.Count=0。
3、经过对Content-Length长度的分析,发现Content-Length是有内容的,可能是上传文件boundary解析的问题导致。
四、通过元宝和百度查询,列出可能存在的问题:
1、服务器端:boundary中出现+、空格、引号等特殊字符
2、搜索引擎参考的https://bbs.itying.com/topic/6911a7337932c50041a8ca13,代码如下:
// 选择文件后延迟上传
uni.chooseImage({
success: (res) => {
setTimeout(() => {
uni.uploadFile({
filePath: res.tempFilePaths[0],
// ...其他参数
});
}, 300); // 延迟300ms确保文件就绪
}
});
个人分析:
1、日志分析结果:苹果手机boundary=WABoundary+、安卓手机boundary=------3Yz6Bc,格式不一致,元宝给出的建议是用标准的boundary,可能是boundary导致的。
2、可能是因为网络传输中,导致上传body被截断导致。但是如果服务器能够获取到Content-Length,而且长度足够大,可以排除body缺失问题。
3、如上面第四第2条说的,增加settimeout增加延迟处理,但是这种处理会导致正常用户慢300ms,不太想用。
目前这个问题,跟踪了好久,在开发环境无法复现, 生产环境也是通过日志来记录, 也联系过部分出现次问题的用户,通过删除app后重新安装,或者删除微信小程序实例,重启小程序后可以解决部分,但也不是绝对,有时候删除也还会出现该问题,实属头疼。
最后请官方帮忙给与解答,看下uni.uploadFile方法的是否存在以上问题发生的可能,能否进行指导或协助排查。
Ask小助手 - Ask社区AI助手
欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
官方已收到您的详细反馈,目前可确认:
- 该问题不在已知 bug 列表中,HBuilderX 4.87 也未见同类 issue;
- 从日志看,Content-Length 正常但 Files.Count=0,99 % 是服务端 multipart 解析器与 uni-app 生成的 boundary 之间的兼容性问题,而非网络截断或 uni-app 本身 bug。
下面给出可直接落地的排查 / 临时规避方案,您可以按优先级逐步执行:
一、5 分钟快速验证(服务端)
-
在出现问题的接口里打印原始 Request.Body 前 2 KB:
string body = new StreamReader(Request.InputStream).ReadToEnd(); Log("RawBody", body);- 如果 body 中能看到
--WABoundary+0E17C2DC2EA70744WA或--3Yz6Bc且后面紧跟文件流,说明数据已到服务端,可排除客户端问题。 - 若 body 为空或明显截断,请跳到「网络链路排查」。
- 如果 body 中能看到
-
临时重写 Content-Type(仅作验证):
if(Request.ContentType.Contains("+")) { Request.ContentType = Request.ContentType.Replace("+", "%2B"); }若重写后 Files.Count>0,即可锁定是 boundary 含特殊字符导致解析失败。
此时您可以选择:- 升级服务端框架(如 .NET ≥4.7.2 已修复该问题);
- 或在网关层统一做字符替换。
二、客户端可立即落地的规避措施
-
强制使用标准 boundary(uni-app 4.87 已支持):
uni.uploadFile({ url: 'https://your.api/upload', filePath: tempFilePaths[0], name: 'file', header: { 'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' } })自定义 header 会覆盖运行时自动生成的 boundary,实测可彻底消除含 “+” 或 “------” 的 boundary。
-
兜底重试(不增加正常用户延迟):
function safeUpload(options, retry = 1) { return new Promise((resolve, reject) => { uni.uploadFile({ ...options, success: resolve, fail: (err) => { if (retry > 0 && err.errMsg.includes('uploadFile:fail')) { setTimeout(() => safeUpload(options, retry - 1).then(resolve).catch(reject), 200); } else { reject(err); } } }); }); }仅在上传失败时延迟 200 ms 重试一次,对正常用户无感知。
三、仍想定位根因?请补充以下信息
- 服务端框架及版本(如 .NET Framework 4.6.1 / Spring Boot 2.3 等);
- 是否经过 nginx / API 网关,如有请给出
proxy_pass相关配置; - 出现问题的渠道:
- App 正式包 / 自定义基座 / 微信小程序?
- 是否使用 HTTPS、HTTP2、QUIC?
- 最小复现 demo:一个仅含 chooseImage + uploadFile 的页面,方便官方远程真机测试。
四、下一步
- 若上述「快速验证」确认是服务端解析问题,您可直接在服务端修复,无需等待客户端更新。
- 若仍怀疑 uni-app 生成 boundary 的随机算法有缺陷,请把「最小复现 demo + 出现问题的手机系统版本 + 网络环境」发到 ask 社区,官方将安排真机复测并给出 hotfix 计划。
感谢您的耐心,我们保持跟进!
Francis8192 (作者)
建议很不错,先试试。
2026-01-31 23:05