一个超级无语的bug,<image>
标签渲染图片,后端给的文件url,是不带诸如.png、.jpg等附件名称后缀的地址,直接返回了https://xx.filename
的文件路径,在iOS和模拟器上能正常读取照片,在安卓上就会展示空白
起初以为是没有把图片的https加入小程序配置的合法域名,
最后的解决方案,是把后端给的url图转换base64
才行
哎这个坑痛心疾首,记录下
实现效果
图片上传公共方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
export function setBase64(file) { return new Promise((resolve, reject) => { uni.getFileSystemManager().readFile({ filePath: file, encoding: 'base64', success: (res) => { resolve(res); }, fail: (e) => { reject(e.msg); uni.$u.toast('图片转换失败'); }, }); }); }
|
安卓专用图片转换方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
export function fileStreamturn(url) { return new Promise((resolve, reject) => { uni.request({ url: url, method: 'GET', responseType: 'arraybuffer', header: { Authorization: uni.getStorageSync('token'), }, success: (res) => { let datas = res.data; let fileName = url.slice(url.indexOf('.') + 1); resolve( `data:image/${fileName};base64,` + uni.arrayBufferToBase64(datas), ); }, }); }); }
|
例子
因为会出现多个<image>
标签,同时转化base64
有较长的等待时,所以做了当前设备判断,如果是安卓才会调用转换方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| var arr = [ 'https://xxx.filename1', 'https://xxx.filename2', 'https://xxx.filename3', ... ]
handleImage(arr) { let result = []; if (arr && arr.length) { if (uni.getSystemInfoSync().platform == "android") { let base64 = []; arr.forEach((item) => { fileStreamturn(item).then((res) => { base64.push(res); }); }); result = base64; } else { result = arr; } } return result }
|