仅部分安卓Chrome用户文件上传AJAX请求报错问题排查求助
可能的故障原因
- 文件引用失效
安卓端Chrome对临时文件引用的处理逻辑和其他浏览器不同,下面两种情况都会导致选中的File对象失效,请求发起时浏览器无法读取文件内容直接终止请求,抛出你遇到的status 0报错:
- 用户选完文件后,页面有DOM更新逻辑替换/重绘了
#doc对应的文件选择input节点,原有files引用被清空 - 用户选完文件后切换过其他应用,系统内存不足时浏览器会回收临时文件引用,或者部分定制安卓ROM的文件选择器返回的是临时权限的文件对象,超过一定时间就无法读取
- 无效请求被浏览器拦截
你当前的代码没有做文件选择校验,直接取$('#doc')[0].files[0]插入FormData:
- 如果用户没有选择文件就点提交,或者选择的文件是浏览器无法访问的受保护路径文件(比如安卓私有目录、云盘缓存文件),构造出的FormData包含无效值,部分版本Chrome会直接拦截这类请求不发送,直接进入错误回调
- 网络/系统策略拦截
- 上传文件体积超出服务器、WAF、CDN的单请求大小限制,中间层直接断开TCP连接,就会返回status 0的报错
- 用户点击提交的瞬间发生网络切换(WiFi切移动网、网络断连),或者安卓系统的节能策略将切入后台的浏览器请求主动终止,也会触发这类错误
- 代码潜在问题
你第一个普通数据的AJAX请求也设置了contentType: false和processData: false,虽然你反馈该请求正常,但这类错误配置可能在部分场景下和第二个文件上传请求产生偶发的上下文冲突,不过概率较低。
修复建议
- 先补全前置校验逻辑,构造FormData前先判断文件是否有效:
const docInput = $('#doc')[0] if (!docInput?.files?.length || !(docInput.files[0] instanceof File)) { showErrorMessage('请选择有效文件后重试') return }
- 扩展错误上报的日志维度,除了请求错误信息,额外上报文件大小、文件类型、当前网络状态(可通过
navigator.connection获取)、页面是否可见(document.hidden),拿到更多特征后更容易定位具体原因 - 给文件上传的AJAX请求添加明确的超时参数
timeout: 30000,同时可以尝试在用户选择文件后立刻将File对象转成Blob暂存,提交时再用Blob构造FormData,避免文件引用失效问题 - 如果有条件可以检查服务器/Nginx的
client_max_body_size配置,以及WAF的上传大小限制,确认是否符合业务的文件上传需求
内容的提问来源于stack exchange,提问作者Guy in the chair
相关产品推荐
相关产品推荐

