Uniapp小程序实现从相册选图/拍照后直接上传

最近在做小程序项目的时候遇到一个需求,就是实现从相册选图/拍照后直接调用后端接口上传,我想如果你此时忽略小程序不是基于浏览器运行的,然后想着怎么样去用向后端发送file格式文件,那真的就是大错特错了... 因为基于浏览器内置的JS环境根本就没有FormData、File等这些class... 看下效果图...

 

首先看下从相册选取图片/拍照的UNI API,这个没啥,直接依据文档调用就好... 

// 从相册选图
uni.chooseImage({
	count: 12, // 最多可以选择的图片张数,默认9
	sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有
	sourceType: ['album'], //album 从相册选图,camera 使用相机
	success: (res) => {
        // TODO SUCCESS
    }
})

// 使用相机
uni.chooseImage({
	count: 12, // 最多可以选择的图片张数,默认9
	sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有
	sourceType: ['camera'], //album 从相册选图,camera 使用相机
	success: (res) => {
        // TODO SUCCESS
    }
})

// 从相册选图/使用相机
uni.chooseImage({
	count: 12, // 最多可以选择的图片张数,默认9
	sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有
	sourceType: ['album ','camera'], //album 从相册选图,camera 使用相机
	success: (res) => {
        // TODO SUCCESS
    }
})

通过上述方法,发现通过success中的res,能够获取到图片临时文件的数组tempFilePaths,可以直接通过调用接口的方式,将临时文件交给后端去做处理,由于当时后端不接受这个临时文件,我就又多做一步处理,将临时文件处理为base64,然后再传给他...

简单说下怎么将临时文件转为base64,首先通过uni.getFileSystemManager()拿到文件处理器,因为需要读取文件的方法 ,然后遍历临时文件的数组去依次转换,由于读取文件的方法是异步的,这里需要Promise.all来处理一下,否则你传递给后端的base64数组还会是声明时候的空数组...

 

Promise.all(
	res.tempFilePaths.map(item => {
		return new Promise((resolve, reject) => {
			fs.readFile({
				filePath: item,
				encoding: 'base64',
				success: res => {
					resolve('data:image/png;base64,' + res
						.data)
				},
				fail: err => {
					reject(err)
				}
			})
		})
	})
).then(results => { // 在这里处理所有文件的内容
	that.uploadLivePic(results)
})

 到这里成功完成图片的上传,感觉对自己有帮助的小伙伴,可以留个star...

uni-app中,要实现在微信小程序中让用户选择相册拍照的功能,你可以使用uni-app提供的`picker`组件配合`getMediaInfo` API。以下是简单的步骤: 1. **引入依赖**: 首先,在页面的wxml文件里引用`uni-picker`组件,并确保已安装了相应的插件如 `@dcloudio/uni-pickers`。 ```html <view> <uni-picker v-model="pickResult" range="{{pickList}}" placeholder="请选择图片来源"></uni-picker> </view> ``` 2. **数据绑定和选项设置**: 在对应的wxss和js文件中,初始化`pickList`数组并处理选择结果。 ```javascript // .js 文件 export default { data() { return { pickList: ['相机', '相册'], pickResult: '' }; } } // .wxml 文件 <script> Page({ onLoad() { this.setData({ pickList: ["相机", "相册"] }); }, }) </script> ``` 3. **事件监听**: 在`uni-picker`上添加change事件监听,用户选择后获取选中的值,然后通过API打开相应的功能。 ```javascript pickerChange(e) { if (e.detail.value === '相机') { uni.getImageFromCamera({ success(res) { // 处理拍照后的图片 }, fail(err) { console.error('获取照片失败:', err); } }); } else { uni.getPhotosLibrary({ success(res) { // 处理从相册选取的照片 }, fail(err) { console.error('获取照片库失败:', err); } }); } }, ``` 4. **触发事件**: 将`pickerChange`函数绑定到`uni-picker`的change事件。 ```html <uni-picker bind-change="pickerChange"></uni-picker> ``` 5. **注意事项**: - 确保小程序已经配置了相应的权限,如访问相册权限。 - 根据微信官方文档更新API的使用方法,因为可能会有版本变化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值