uni-app实现图片上传功能 uni-app调用相机和相册选择图片

小涛大大_9668

小涛大大_9668

2026-06-02

1199人浏览

原创

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

uni-app实现图片上传功能 uni-app调用相机和相册选择图片

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。

uni-app
uni-app

uni-app 是基于 Vue 的跨端开发框架,适合开发 H5、App、小程序、鸿蒙和多端业务应用。

下载

注意:这个 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 则是页面刷新即失效。别想复用上次选的图路径,每次都要重新选、重新传。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

uni-app

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2703

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5863

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6830

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6558

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

943

5

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

0

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

0

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习