2023-04-15 02:16:02
在UniApp中实现跨平台图片上传功能时,核心思路是通过条件编译区分不同平台,并调用各平台适配的API。以下是具体实现方案及关键注意事项:
一、基础实现框架(条件编译)// 图片选择逻辑(跨平台适配)chooseAndUploadImage() { #ifdef APP-PLUS // App平台原生选择图片 uni.chooseImage({ count: 1, sourceType: ['album', 'camera'], success: (res) => { const tempFilePaths = res.tempFilePaths; this.uploadImage(tempFilePaths[0]); // 调用上传方法 } }); #elif H5 // H5平台使用input元素 const input = document.createElement('input'); input.type = 'file'; input.accept = 'image/*'; input.onchange = (e) => { const file = e.target.files[0]; this.uploadH5Image(file); // H5专用上传方法 }; input.click(); #elif MP-WEIXIN // 微信小程序选择图片 uni.chooseImage({ count: 1, sizeType: ['compressed'], sourceType: ['album', 'camera'], success: (res) => { this.uploadMiniProgramImage(res.tempFilePaths[0]); } }); #endif},二、各平台上传实现细节1. App平台(iOS/Android)需处理Android权限问题(存储权限、相机权限)
大文件建议压缩后上传
uploadImage(filePath) { uni.compressImage({ src: filePath, quality: 80, success: (compressedRes) => { uni.uploadFile({ url: '需处理跨域问题(CORS)
建议显示上传进度
uploadH5Image(file) { const formData = new FormData(); formData.append('file', file); formData.append('userId', '123'); uni.request({ url: '需配置小程序合法域名
可使用wx.compressImage优化体验
uploadMiniProgramImage(tempFilePath) { wx.compressImage({ src: tempFilePath, quality: 70, success: (res) => { wx.uploadFile({ url: '统一接口设计:
封装跨平台上传方法,对外暴露相同接口
// 统一上传接口function unifiedUpload(file) { #ifdef APP-PLUS return uploadAppImage(file); #elif H5 return uploadH5Image(file); #else return uploadDefaultImage(file); #endif}错误处理机制:
捕获各平台特有错误码
提供用户友好的提示
handleError(err) { #ifdef MP-WEIXIN if (err.errMsg.includes('chooseImage:fail')) { uni.showToast({ title: '请授权相机权限', icon: 'none' }); } #endif // 其他平台错误处理...}性能优化方案:
大文件分片上传(App端可用plus.io.request)
并发控制(建议同时上传不超过3个文件)
本地缓存已上传文件路径
Android选择图片失败:
检查manifest.json中是否配置了存储权限
测试不同Android版本兼容性
iOS上传卡顿:
压缩图片质量(建议70%-80%)
使用WebP格式减少体积
H5跨域问题:
服务器配置Access-Control-Allow-Origin: *
开发环境配置代理(vue.config.js)
小程序域名限制:
在微信公众平台配置合法域名
开发阶段勾选"不校验合法域名"
图片预览功能:
previewImage(current) { #ifdef APP-PLUS plus.gallery.preview(current); #else uni.previewImage({ current: current, urls: this.imageList }); #endif}多图上传进度显示:
使用uni.showLoading显示总体进度
各平台通过上传事件的onProgressUpdate回调更新进度
图片裁剪功能:
App端使用plus.nativeObj.Bitmap
H5端使用cropperjs库
小程序端使用<camera>组件或第三方插件
通过以上方案,可实现95%以上场景的跨平台图片上传需求。实际开发中建议先实现核心功能,再逐步完善各平台特有优化。对于复杂需求(如视频上传、EXIF信息处理等),可参考UniApp官方插件市场中的现成解决方案。