Francis8192
Francis8192
  • 发布:2026-01-31 22:46
  • 更新:2026-01-31 22:47
  • 阅读:18

【报Bug】uni.uploadFile概率出现服务器端无法解析文件,服务器显示context.Request.Files.Count=0

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: windows10专业版

HBuilderX类型: 正式

HBuilderX版本号: 4.87

手机系统: Android

手机系统版本号: Android 12

手机厂商: 华为

手机机型: BLK-AL00

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

上传参数:
let promise = new Promise((resolve, reject) => {
let defaultOptions = {
url: '',
header:{},
name: options.name || 'fileName',
filePath: options.filePath || '',
formData: options.data || {},

操作步骤:

目前开发环境无法复现。

预期结果:

确保服务器能够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方法的是否存在以上问题发生的可能,能否进行指导或协助排查。

2026-01-31 22:46 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

官方已收到您的详细反馈,目前可确认:

  1. 该问题不在已知 bug 列表中,HBuilderX 4.87 也未见同类 issue;
  2. 从日志看,Content-Length 正常但 Files.Count=0,99 % 是服务端 multipart 解析器uni-app 生成的 boundary 之间的兼容性问题,而非网络截断或 uni-app 本身 bug。

下面给出可直接落地的排查 / 临时规避方案,您可以按优先级逐步执行:


一、5 分钟快速验证(服务端)

  1. 在出现问题的接口里打印原始 Request.Body 前 2 KB:

    string body = new StreamReader(Request.InputStream).ReadToEnd();  
    Log("RawBody", body);  
    • 如果 body 中能看到 --WABoundary+0E17C2DC2EA70744WA--3Yz6Bc 且后面紧跟文件流,说明数据已到服务端,可排除客户端问题。
    • 若 body 为空或明显截断,请跳到「网络链路排查」。
  2. 临时重写 Content-Type(仅作验证):

    if(Request.ContentType.Contains("+"))  
    {  
       Request.ContentType = Request.ContentType.Replace("+", "%2B");  
    }  

    若重写后 Files.Count>0,即可锁定是 boundary 含特殊字符导致解析失败。
    此时您可以选择:

    • 升级服务端框架(如 .NET ≥4.7.2 已修复该问题);
    • 或在网关层统一做字符替换。

二、客户端可立即落地的规避措施

  1. 强制使用标准 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

  2. 兜底重试(不增加正常用户延迟):

    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 重试一次,对正常用户无感知。


三、仍想定位根因?请补充以下信息

  1. 服务端框架及版本(如 .NET Framework 4.6.1 / Spring Boot 2.3 等);
  2. 是否经过 nginx / API 网关,如有请给出 proxy_pass 相关配置;
  3. 出现问题的渠道
    • App 正式包 / 自定义基座 / 微信小程序?
    • 是否使用 HTTPS、HTTP2、QUIC?
  4. 最小复现 demo:一个仅含 chooseImage + uploadFile 的页面,方便官方远程真机测试。

四、下一步

  • 若上述「快速验证」确认是服务端解析问题,您可直接在服务端修复,无需等待客户端更新。
  • 若仍怀疑 uni-app 生成 boundary 的随机算法有缺陷,请把「最小复现 demo + 出现问题的手机系统版本 + 网络环境」发到 ask 社区,官方将安排真机复测并给出 hotfix 计划。

感谢您的耐心,我们保持跟进!

内容为 AI 生成,仅供参考
  • Francis8192 (作者)

    建议很不错,先试试。

    2026-01-31 23:05

要回复问题请先登录注册