简介:本文深入探讨uni-app中uni.chooseImage API的完整使用流程,涵盖相机调用、相册选择及图片转base64编码的详细步骤,适合开发者快速掌握图片处理核心技能。
uni.chooseImage是uni-app框架提供的跨平台图片选择API,支持同时调用设备相机拍照和从相册选择图片。其核心参数包括:
count:最大选择数量(默认9,iOS单次最多9张)sourceType:图片来源(’album’相册/‘camera’相机/[‘album’,’camera’]两者)sizeType:返回图片尺寸(’original’原图/‘compressed’压缩图)success:成功回调函数fail:失败回调函数complete:完成回调函数该API的跨平台特性尤为突出,在微信小程序、H5、App等多端表现一致。根据uni-app官方文档,其实现原理基于各平台原生能力封装,iOS通过UIImagePickerController实现,Android通过Intent调用系统相机/相册,H5端则依赖input[type=file]元素。
uni.chooseImage({count: 1,sourceType: ['album', 'camera'],sizeType: ['compressed'],success: (res) => {const tempFilePaths = res.tempFilePaths;console.log('图片临时路径:', tempFilePaths[0]);// 此处可添加base64转换逻辑},fail: (err) => {console.error('选择图片失败:', err);}});
在uni-app中,需通过uni.getFileSystemManager()获取文件管理器,再使用readFile方法读取文件内容:
function imageToBase64(filePath) {return new Promise((resolve, reject) => {// #ifdef APP-PLUSconst fs = uni.getFileSystemManager();fs.readFile({filePath: filePath,encoding: 'base64',success: (res) => {const base64Data = 'data:image/jpeg;base64,' + res.data;resolve(base64Data);},fail: (err) => {reject(err);}});// #endif// H5端特殊处理// #ifdef H5const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');const img = new Image();img.crossOrigin = 'Anonymous';img.onload = () => {canvas.width = img.width;canvas.height = img.height;ctx.drawImage(img, 0, 0);const base64 = canvas.toDataURL('image/jpeg');resolve(base64);};img.src = filePath;// #endif});}
export default {methods: {async selectAndConvertImage() {try {const res = await uni.chooseImage({count: 1,sourceType: ['album', 'camera'],sizeType: ['compressed']});const tempPath = res.tempFilePaths[0];const base64Str = await imageToBase64(tempPath);this.handleBase64Image(base64Str);} catch (error) {uni.showToast({title: '处理失败',icon: 'none'});console.error('完整流程错误:', error);}},handleBase64Image(base64) {// 实际应用场景处理console.log('Base64编码:', base64.substring(0, 50) + '...');// 可上传至服务器或直接显示}}}
app.json中配置"requiredPrivateInfos": ["chooseImage"]NSPhotoLibraryUsageDescriptionsizeType: ['compressed']减少数据量
// #ifdef APP-PLUSconst fs = uni.getFileSystemManager();fs.unlink({filePath: tempPath,success: () => console.log('临时文件已删除')});// #endif
async uploadAvatar() {const [res] = await uni.chooseImage({count: 1,sourceType: ['camera'],sizeType: ['compressed']});const base64 = await this.imageToBase64(res.tempFilePaths[0]);const uploadRes = await uni.uploadFile({url: 'https://example.com/upload',filePath: res.tempFilePaths[0],name: 'avatar',formData: {'base64': base64.split(',')[1] // 去除data前缀}});// 处理上传结果...}
uni.chooseImage({sourceType: ['camera'],// 自定义相机参数(部分平台支持)// #ifdef APP-PLUSextension: {guide: true, // 显示引导线ratio: [3, 4] // 指定宽高比}// #endif});
chooseImage:fail permission deniedapp.json中添加配置
{"permission": {"scope.userLocation": {"desc": "你的位置信息将用于定位"},"scope.writePhotosAlbum": {"desc": "需要保存图片到相册"}}}
// native.js调用示例if (plus.os.name === 'Android') {const main = plus.android.runtimeMainActivity();if (plus.android.invoke(main, 'checkSelfPermission', 'android.permission.WRITE_EXTERNAL_STORAGE')!== plus.android.PackageManager.PERMISSION_GRANTED) {plus.android.invoke(main, 'requestPermissions',['android.permission.WRITE_EXTERNAL_STORAGE'], 1001);}}
解决方案:
location /upload {proxy_pass http://backend-server;add_header 'Access-Control-Allow-Origin' '*';}
uni.request({url: 'https://example.com/api',header: {'Content-Type': 'application/x-www-form-urlencoded'}});
function getOptimizedSize(width) {const screenWidth = uni.getSystemInfoSync().windowWidth;return width > screenWidth * 2 ? screenWidth * 2 : width;}
async function processMultipleImages(paths) {const promises = paths.map(path => imageToBase64(path));return await Promise.all(promises);}
通过系统掌握uni.chooseImage API的使用方法,开发者可以高效实现图片选择、处理和传输的全流程功能。实际开发中需结合具体业务场景,在性能、用户体验和兼容性之间取得平衡。建议建立完整的错误处理机制,并通过真机测试验证各平台表现。