最稳路径是直接调用uni.choosemedia拍照并用uni.uploadfile上传;必须传sourcetype数组且至少两项(如['camera','album']),ios否则报“no suitable source”;取路径用res.tempfiles[0].tempfilepath,不可用tempfilepaths[0]。

直接调用 uni.chooseMedia 拍照 + uni.uploadFile 上传,是当前最稳、最兼容的路径;别再用已标记为兼容模式的 uni.chooseImage,它返回字段已不一致,容易在 iOS 或 H5 上静默失败。
uni.chooseMedia 拍照参数必须写成数组且至少两个选项
这是 iOS 真机上弹不出相机框的头号原因。iOS 要求 sourceType 至少包含两项(哪怕你只想要拍照),否则直接报错 “no suitable source”。
-
sourceType: ['camera', 'album']✅ 正确,iOS/Android/小程序都兼容 -
sourceType: ['camera']❌ iOS 直接失败,Android 和小程序可能侥幸通过但逻辑不可靠 -
sourceType: 'camera'❌ 字符串写法,所有平台都会报类型错误 - H5 端会自动降级为文件选择框,
['camera']不会唤起摄像头,但也不会报错——别指望它能真拍
取临时路径别再用 tempFilePaths[0]
uni.chooseMedia 返回结构和旧版 uni.chooseImage 完全不同,硬套老写法会导致 undefined 或白屏。
- 正确取法:
res.tempFiles[0].tempFilePath(完整图)或res.tempFiles[0].thumbTempFile?.tempFilePath(缩略图,注意可选链) -
res.tempFilePaths字段已不存在,访问即undefined - H5 下
thumbTempFile常为空,直接 .tempFilePath 会报错,务必加? - 如果只传
count: 1,就放心取[0];不设count默认是 9,但用户可能多选,得遍历处理
uni.uploadFile 的 filePath 必须是 tempFilePath,不是 base64
有人想省事转 base64 再发,这在真机尤其 iOS 上极易触发内存溢出或超时;uni.uploadFile 原生支持临时路径上传,别绕路。
-
filePath字段必须填res.tempFiles[0].tempFilePath,不能是 data URL 或 blob - 上传前可加简单校验:
if (!filePath || !/^(wxfile|file|http)/.test(filePath))防止空路径提交 - App 端临时文件有效期约 24 小时,小程序约 30 分钟,H5 是浏览器生命周期内有效——传完就删,别缓存
- 后端接收时,注意 multipart 表单字段名默认是
file,如需改用name参数指定
真正容易被忽略的是权限链:微信小程序开发版下相机功能默认禁用,必须把 envVersion 设为 release 或 trial 才能触发;App 端首次调用前最好先 uni.getSystemInfo + uni.authorize({scope: 'scope.camera'}) 主动申请,否则 Android 11+ 可能静默拒绝。











