必须用 uni.uploadFile 而非 uni.request 上传图片,因后者不支持文件流,base64 方式会导致 iOS 崩溃、安卓超时、小程序审核拒审;正确流程为选图→取临时路径→传 filePath,文本字段拼 query 字符串,name 须与后端字段名严格一致。

直接用 uni.uploadFile 提交带图片的反馈,别用 uni.request 拼 multipart 数据——真机必失败,小程序审核会拒。
为什么不能用 uni.request 传图片?
因为 uni.request 不支持文件流上传,它只能发纯文本或 JSON;即使你把图片转成 base64 再塞进 body,也会触发以下问题:
- iOS 真机直接崩溃(内存溢出)
- 安卓端上传超时(base64 膨胀约 33%,大图极易超限)
- 微信/支付宝小程序审核被拒(违反平台「文件必须走 upload 接口」的规范)
uni.uploadFile 的正确调用姿势
必须严格按「选图 → 拿临时路径 → 传 filePath」三步走,文本字段不能放 data 对象里,得拼成 query 字符串:
- 图片:先调
uni.chooseImage,拿到tempFilePaths[0],再传给filePath参数 - 文本字段(如 title、content):拼成
title=xxx&content=yyy字符串,作为formData值 -
name参数必须和后端接收的文件字段名完全一致(比如后端 expectfeedback_image,前端就得写name: 'feedback_image') - 接口 Content-Type 必须是
multipart/form-data,后端不能只接 JSON
表单验证和用户体验细节
反馈表单不是只管提交,用户输错、图片没选、网络断了都得有反馈:
- 用
@blur或@input做实时校验,别等点击提交才提示;例如描述为空时立刻uni.showToast({ title: '请填写反馈内容', icon: 'none' }) - 每次调
uni.showToast前加uni.hideToast(),避免 Toast 叠加卡死界面 - 提交按钮要加 loading 状态(
button :disabled="submitting"),防止重复点击 - 后端返回 400 错误时,别只读
res.data.msg,要深挖res.data.data里的具体字段错误(如res.data.data.image提示“图片格式不支持”)
最常被忽略的是后端字段名一致性——前端 name 和后端接收字段名差一个字母,整个上传就静默失败,连 error 都不抛。调试时务必用抓包工具看实际发出的 form data key 是什么。











