赞
踩
最近在做小程序项目的时候遇到一个需求,就是实现从相册选图/拍照后直接调用后端接口上传,我想如果你此时忽略小程序不是基于浏览器运行的,然后想着怎么样去用向后端发送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...
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。