背景:
后台同学:同学,下载图片你能不能自己下载,不用调我接口,base64图片你也有
我:想了一下,能成,用a标签,设置href为base64的值,岂不是就完成了,就回答到,可以
后台同学:那你能实现我就不提供了
我:没问题,小case
开始吧:
3下5除2写完了,就是将base64的值赋值给创建的a标签的href
测试一下:完蛋,浏览器不允许
然后一顿百度猛如虎
后来找到了一个可行性方案,跟大家分享一下,可以直接使用
思路:
1,将base64转化为File 文件
2,动态创建a标签实现文件流的下载
上代码:
1)将base64转化为File 文件
dataurl: 'data:image/png;base64,XXXXX...',
filename: '文件名'
base64ImgtoFile (dataurl, filename = 'file') {
//将base64格式分割:['data:image/png;base64','XXXX']
const arr = dataurl.split(',')
// .*? 表示匹配任意字符到下一个符合条件的字符 刚好匹配到:
// image/png
const mime = arr[0].match(/:(.*?);/)[1] //image/png
//[image,png] 获取图片类型后缀
const suffix = mime.split('/')[1] //png
const bstr = atob(arr[1]) //atob() 方法用于解码使用 base-64 编码的字符串
let n = bstr.length
const u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], `${filename}.${suffix}`, {
type: mime
})
},
2)将1中得到的File转化为图片的URL
const blob = this.base64ImgtoFile(dataurl)
const blobUrl = window.URL.createObjectURL(blob);
// 这里的文件名根据实际情况从响应头或者url里获取
const filename = blob.name;
const a = document.createElement('a');
a.href = blobUrl;
a.download = filename;;
a.click();
window.URL.revokeObjectURL(blobUrl);
通过上面2步即可完成前端base64图片的下载
进一步思考:如何将文件转换为base64那?
例如:我们利用element el-upload很容易获取到上传的文件
利用new FileReader对象的readAsDataURL方法可以将读取到的文件编码成DataURL
changeFile(file, fileList) {
var This = this;
var reader = new FileReader();
reader.readAsDataURL(file.raw);
reader.onload = function(e){
this.result; //base64编码
This.imageBaseUrl = this.result;
This.imageUrl = this.result;
}
},