需求:pc端传参调接口后端生成一个二维码下载,移动端直接扫码显示对应内容
处理一: 直接将字段传给后端生产二维码下载
问题: 某些情况下移动端扫码错误 原因: 字段中不仅有特殊字符还有中文,扫码解析时乱码
处理二: 将传参转化为base64编码,度娘一下,30秒搞定,附上代码:
编码: const str= 'this is 中文'
window.btoa(encodeURIComponent(str))
解码: decodeURIComponent(window.atob('JUU0JUI4JUFEJUU2JTk2JTg3'))
但是问题来了,要求移动端不需要解码,不用encodeURIComponent() (就很方...) 如果直接用window.btoa转码,遇到中文Chrome浏览器会抛出异常, 30秒是不能解决了 哼哧哼哧......
处理三: 直接转化为base64,附上代码:
--js中内置的base64编码和解码:
var encodedData = window.btoa("Hello, world"); // 编码(有中文抛出异常,此处不符合需求 舍弃)
var decodedData = window.atob(encodedData); // 解码
--node中自带的base64的编码与解码分为三种:普通字符串/十六进制/图片:
(1) 普通字符串
//编码
new Buffer(String).toString('base64'); // 他来了 他来了
//解码
new Buffer(base64Str, 'base64').toString();
(2)十六进制Hex
//编码
new Buffer(String, 'base64').toString('hex');
//解码
new Buffer(base64Str, 'hex').toString('utf8');
(3)图片
const fs = require('fs');
//编码
function base64_encode(file) {
let bitmap = fs.readFileSync(file);
return new Buffer(bitmap).toString('base64');
}
//解码
function base64_decode(base64str, file) {
var bitmap = new Buffer(base64str, 'base64');
fs.writeFileSync(file, bitmap);
}
最终采用: new Buffer(String).toString('base64');
Done~
这一行代码看着30秒也能搞定,但是在大千世界找到它用了30分钟,你知道对于三千小世界,是多少生物的一辈子啊. 怎么办呢,前端地位...懂得人都懂 ==||
最后附上base64转码加二维码下载代码,虽然30秒你也能搞定:
downLoadCode(code) {
// 转码base64
const base64= new Buffer(code).toString('base64')
deviceLedger.downloadCode(base64).then( res => {
if (res) {
let data = res.data;
const xlsxData = new Blob([data], {type: 'application/octet-stream'});
if (window.navigator.msSaveOrOpenBlob) { // msSaveOrOpenBlob方法返回bool值
navigator.msSaveBlob(xlsxData, '二维码' + '.png')// 本地保存
} else {
let link = document.createElement('a'); // a标签下载
link.href = window.URL.createObjectURL(xlsxData);
link.download = '二维码' + '.png';
link.dispatchEvent(new MouseEvent('click',
{bubbles: true, cancelable: true, view: window}));
window.URL.revokeObjectURL(link.href);
}
this.$message({
type: 'success',
message: '下载成功!'
});
}
})
}