layui上传要求服务端返回json必须含数字型code=0和字符串型msg字段,content-type须为application/json,否则触发data-format-error;其他字段如data可选但须合法,嵌套或自定义键名均不识别。
服务端返回的 json 必须包含 code 和 msg 字段,code 为 0 表示成功,非 0 视为失败;其他字段(如 data)可选,但若存在,必须是合法 json 值 —— 否则触发 data-format-error。
响应结构必须满足 Layui 的硬性约定
Layui upload 不解析嵌套或自定义键名,它只认固定字段:code 和 msg。哪怕后端返回 {"status": 0, "message": "ok"},也会报错,因为没找到 code。
-
code必须是数字类型(不能是字符串"0"),值为0才走done回调;其他值(包括null、undefined、"1")都进error回调 -
msg必须是字符串,哪怕为空也要写"msg": "",缺失或类型不对会中断解析 - 如果返回了
data,它必须是可序列化的值(对象/数组/字符串/数字/布尔),不能是函数、undefined 或循环引用 - 响应头
Content-Type必须是application/json,否则连 JSON 解析步骤都不会触发
常见错误现象与对应修复
上传后无反应、弹“上传失败”、控制台报 data-format-error,基本都源于响应格式不合规。
- 后端用 PHP 的
echo json_encode(['status'=>0])→ 缺code和msg,改成['code'=>0, 'msg'=>'success'] - Node.js 用
res.json({ code: '0', msg: 'ok' })→code是字符串,改成code: 0 - Java Spring Boot 返回
@ResponseBody对象但没配@RestController或produces = "application/json"→ 响应头不是application/json,加配置或手动设 header - Python Flask 返回
jsonify({'code': 0})但没写msg→ 补上'msg': ''
如何验证响应是否合格
别依赖浏览器预览或 console.log,直接看 Network 面板里该请求的 Response 和 Headers 两栏。
- Response 内容要能被 JSON.parse() 成功执行,且结果对象有
code(number)、msg(string) - Headers 里必须含
Content-Type: application/json,不能是text/html或text/plain - 如果用了 Nginx 或 CDN,检查是否缓存了非 JSON 响应(比如 50x 错误页),这类响应常被当成上传结果返回
真正容易被忽略的是:Layui 在解析失败时不会告诉你具体哪条字段出问题,只抛一个笼统的 data-format-error。最稳妥的做法,是在服务端统一封装返回逻辑,确保所有上传接口都走同一套 JSON 模板,而不是每个接口手写一遍。











