在项目的开发过程中,发现部分手机多次生成海报后,绘制的海报上的由base64生成的二维码不生效。
在确定后台接口返回的base64格式的二维码无问题后,那么我们一步步分析,失效原因可能是前端转换base64或者绘制二维码导致的。经过仔细分析、查找,发现是由于转换base64的过程存在本地缓存的问题,所以,我们采用先删除本地的缓存,再去转换base64的方法。
一·、删除缓存、转换base64
const fsm = wx.getFileSystemManager();
1、删除缓存
function removeSave() {
return new Promise((resolve) => {
// 把文件删除后再写进,防止超过最大范围而无法写入
fsm.stat({ // 获取文件列表
path: ${wx.env.USER_DATA_PATH}
, // 当时写入的文件夹
recursive: true,
success(res) {
console.log(‘删除res’, res)
Object.keys(res.stats).forEach(path => {
var stats = res.stats[path]
if (stats.path.includes(‘tmp_base64src’)) {
//删除指定路径的文件
fsm.unlink({
filePath: ${wx.env.USER_DATA_PATH}
+ stats.path,
success: function (e) {
console.log(‘readdir文件删除成功:’, stats)
},
fail: function (e) {
console.log(‘readdir文件删除失败:’, stats)
}
})
}
})
resolve()
},
fail(err) {
console.log(’—失败’, err)
resolve()
}
})
})
}
2、转换
function base64src(base64data, cb) {
// 先删除缓存
removeSave().then(() => {
let timestamp = new Date().getTime() //时间戳
let FILE_BASE_NAME = ‘tmp_base64src’ + timestamp; //自定义文件名
const [, format, bodyData] = /data:image/(\w+);base64,(.*)/.exec(base64data) || [];
if (!format) {
return (new Error(‘ERROR_BASE64SRC_PARSE’));
}
const filePath = ${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}
;
const buffer = wx.base64ToArrayBuffer(bodyData);
fsm.writeFile({
filePath,
data: buffer,
encoding: ‘binary’,
success() {
console.log(‘filePath成功’, filePath)
cb(filePath);
},
fail() {
console.log(‘filePath失败’)
cb(’’);
// return (new Error(‘ERROR_BASE64SRC_WRITE’));
},
});
})
};
const base64Fun = {
base64src: base64src
}
export default base64Fun;
二、使用方法