一个超级无语的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     }
 
  |