赞
踩
上传图片时,后端接收的参数类型为 Base64,于是我们便使用 uniapp 中的 uni.chooseImage API,搭配 image-tools 插件的 pathToBase64 方法来实现传递 Base64 格式图片的业务需求。
// 业务代码 import { pathToBase64 } from '@/utils/image-tools.js' uni.chooseImage({ count: 1, sourceType: ['camera', 'album'], async success(res) { let ewm = res.tempFilePaths[0] ewm = await pathToBase64(ewm) const data = { formData: { ewm } } const {data: res} = await _this.networkApi(data) // 下方省略 }, })
H5 端没有问题,但在安卓APP 中,当用户勾选原图之后,便出现了问题,经调试排查,发现 await pathToBase64(ewm) 抛出了一个异常
{ "type": "error", "bubbles": false, "cancelBubble": false, "cancelable": false, "lengthComputable": false, "loaded": 0, "total": 0, "target": { "fileName": "/storage/emulated/0/Pictures/Gallery/owner/xxx/IMG_20240202_133858.jpg", "readyState": 2, "result": null, "error": { "code": 15, "message": "targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径!具体请看:https://ask.dcloud.net.cn/article/36199" }, "onloadstart": null, "onprogress": null, "onload": "function() { [native code] }", "onabort": null, "onerror": "function() { [native code] }", "onloadend": null } }
经过阅读文章 https://ask.dcloud.net.cn/article/id-36199,并经过有关尝试后,有以下三种解决方案
// 业务代码 import { pathToBase64 } from '@/utils/image-tools.js' uni.chooseImage({ count: 1, sourceType: ['camera', 'album'], // 添加该配置,仅使用 压缩图 sizeType: ['compressed'], async success(res) { let ewm = res.tempFilePaths[0] ewm = await pathToBase64(ewm) const data = { formData: { ewm } } const {data: res} = await _this.networkApi(data) // 下方省略 }, })
export const saveFileSync = (tempFilePath) => {
return new Promise((resolve, reject) => {
uni.saveFile({
tempFilePath,
success: function (file) {
resolve(file.savedFilePath)
},
fail: function (error) {
reject(error)
}
})
})
}
// 业务代码 import { pathToBase64 } from '@/utils/image-tools.js' import { saveFileSync } from '@/utils/file.js' uni.chooseImage({ count: 1, sourceType: ['camera', 'album'], async success(res) { let ewm = res.tempFilePaths[0] // 使用 saveFileSync,将选择的图片另行保存到本地,并获取保存的地址 const path = await saveFileSync(ewm) ewm = await pathToBase64(path) const data = { formData: { ewm } } const {data: res} = await _this.networkApi(data) // 下方省略 }, })
声明:下方大多是我排查BUG、探索问题产生原因的过程记录,开发任务重的同学可以先去忙哈~
export function pathToBase64(path) { // 省略其他代码 if (typeof plus === 'object') { plus.io.resolveLocalFileSystemURL( getLocalFilePath(path), function(entry) { entry.file( function(file) { var fileReader = new plus.io.FileReader() fileReader.onload = function(data) { resolve(data.target.result) } fileReader.onerror = function(error) { reject(error) } fileReader.readAsDataURL(file) }, function(error) { reject(error) } ) }, function(error) { reject(error) } ) return } // 省略其他代码 }
接上文,应用程序在分区存储的环境下,分出了两个可操做文件数据目录:系统公共目录 和 应用沙盒目录,尽管 dcloud 对分区存储机制做了适配工作,但系统公共目录的操作权限自然不如应用沙盒目录来的广泛、自由
而使用 uni.saveFile 可以将选择自相册(系统公共目录)的文件,另存到应用沙盒目录中,由此便可以规避各种各样的操作问题了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。