uni-app推荐用uni.chooseMedia替代uni.chooseImage,需传数组形式的sourceType(如['camera']),注意iOS至少两个选项;返回tempFiles[0].tempFilePath路径,上传前建议压缩,各端临时文件有效期不同。

uni-app怎么调用相机或相册选图
直接用 uni.chooseImage 就行,但注意它在新版本里已被标记为兼容模式,推荐优先用 uni.chooseMedia —— 后者支持图片+视频、可指定来源、返回结构更统一,且 H5 和小程序端行为更一致。
常见错误是只写 sourceType: ['camera'] 却没加 ['album'],结果 iOS 上点选图直接报错“no suitable source”,因为 iOS 要求至少两个选项才允许弹窗;Android 倒是能过,但逻辑不健壮。
-
sourceType必须是数组,哪怕只想要相机也要写成['camera'],不能是字符串 - 想限制只能拍照,就传
['camera'];只从相册选,就传['album'];两者都开放,写['camera', 'album'] - H5 端不支持
camera,实际会降级为文件选择框,别指望真调起摄像头 - 微信小程序要求
envVersion为release或trial才能调用相机,开发版可能静默失败
uni.chooseMedia 返回的图片路径怎么用
uni.chooseMedia 返回的是对象数组,每个项有 tempFile(临时文件对象)和 thumbTempFile(缩略图),不是直接的 tempFilePath 字符串。老代码里习惯拼 res.tempFilePaths[0] 会报错。
正确取法是:res.tempFiles[0].tempFilePath(完整图)或 res.tempFiles[0].thumbTempFile.tempFilePath(缩略图)。注意:H5 端 thumbTempFile 可能为空,别直接 .tempFilePath。
- 单图上传场景,建议默认用
tempFiles[0].tempFilePath - 需要预览,直接把该路径赋给
即可,uni-app 内部会自动处理本地临时路径 - 如果用了
capture="camera"的 input(H5 专用),返回的是event.detail.value文件列表,结构完全不同,别和uni.chooseMedia混用
上传前要不要压缩图片?怎么压
要压,尤其安卓低端机拍的照片动辄 3–5MB,直接传不仅慢,还容易触发小程序 10MB 临时文件限制或后台超时。uni-app 没内置压缩 API,得自己调 uni.compressImage。
注意:这个 API 在 H5 不可用,调用会静默失败;App 端需 3.1.0+,旧版也不支持。iOS 微信小程序压缩后可能颜色偏暗(iOS 图像处理 bug),建议压缩质量设为 80 而非默认 90。
- 先
uni.chooseMedia拿到路径,再传给uni.compressImage,不要试图对 base64 压缩(性能差、内存爆) -
quality设 60–80 之间较稳妥,低于 50 文字/二维码可能模糊 - 压缩后返回的新路径仍属临时文件,仍需在本次生命周期内完成上传,不能存起来下次用
- 如果后端接受 base64,可以用
uni.getFileSystemManager().readFile读二进制再转,但体积翻倍,一般不推荐
上传接口怎么写才不容易 400 或超时
核心是别用 uni.uploadFile 直传原始路径,先检查路径是否存在、是否为 string 类型——常见坑是传了 undefined 或对象进去,结果后端收不到字段,返回 400 却查不出原因。
另外,uni.uploadFile 的 name 参数不是文件名,是后端接收的表单字段名(比如 PHP 的 $_FILES['file'],Java 的 @RequestParam("file")),填错就 400;而 fileName 才是发过去的真实文件名,默认是随机字符串,如需固定名得手动设。
- 务必在
success回调里检查res.statusCode === 200,别只看res.data是否有内容 - 大图上传加
timeout: 60000(默认 60s 太短),并配fail提示“上传超时,请检查网络” - 如果后端要求带 token,用
header传,别塞在formData里——后者是表单数据,不是请求头 - 多图上传别循环调
uploadFile,改用 Promise.all + 限制并发数(如 3 个),否则安卓容易卡死
真正麻烦的不是调起相机或拼路径,而是各端对「临时文件生命周期」的理解差异:App 端临时路径 24 小时有效,微信小程序只有 30 分钟,H5 则是页面刷新即失效。别想复用上次选的图路径,每次都要重新选、重新传。











