vue 通过base64实现图片下载功能


Posted in Vue.js onDecember 19, 2020

1. 使用场景

当我们处理图片下载功能的时候,如果本地的图片,那么是可以通过canvas获得图片的base64的,方法如下。但是如果图片的url存在跨域问题的话,下面的方法将行不通,这时候我们可以另辟蹊径,将后台的同学,将图片以base64的形式进行返回。

function getBase64(url){
  //通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片,相比 createElement() 创建 <img> 省去了 append(),也就避免了文档冗余和污染
  var Img = new Image(),
    dataURL='';
  Img.src=url;
  Img.onload=function(){ //要先确保图片完整获取到,这是个异步事件
    var canvas = document.createElement("canvas"), //创建canvas元素
      width=Img.width, //确保canvas的尺寸和图片一样
      height=Img.height;
    canvas.width=width;
    canvas.height=height;
    canvas.getContext("2d").drawImage(Img,0,0,width,height); //将图片绘制到canvas中
    dataURL=canvas.toDataURL('image/jpeg'); //转换图片为dataURL
  };
}

2. 处理base64,进行下载

处理base64的时候有两点要注意,一个是对ie浏览器的处理,一个是对火狐浏览器的处理

2-1. 我们首先直接处理base64(基于vue)

1.由于后台返回的是纯base64,如果要完成图片的下载功能,必须加上一个前缀

<template>
 <a
  :href="prefixBase64 + qrBase64" rel="external nofollow" rel="external nofollow" 
  download="qrcode.png"
  class="qrcode"
 >
  <img src="static/img/load.png">
 </a>
</template>
 
<script>
 ...
 data () {
  return {
   qrBase64: '', // 二维码对应的base64(在方法里面进行获取)
   prefixBase64: 'data:image/png;base64,', // base64前缀
  }
 }
 ...
</script>

2.采用这种方式可以很好的支持chrome、Firefox、opera、Safari,但是不支持ie,所以我们下面单独处理ie浏览器

2-2. 处理ie浏览器

1.修改代码如下

<template>
 <a
  @click.stop.prevent="handleDownloadQrIMg"
  class="qrcode"
 >
  <img src="static/img/load.png">
 </a>
</template>
<script>
export default {
 methods: {
  // 点击下载图片
  handleDownloadQrIMg() {
   // 这里是获取到的图片base64编码,这里只是个例子哈,要自行编码图片替换这里才能测试看到效果
   const imgUrl = this.prefixBase64 + this.qrBase64;
   // 如果浏览器支持msSaveOrOpenBlob方法(也就是使用IE浏览器的时候),那么调用该方法去下载图片
   if (window.navigator.msSaveOrOpenBlob) {
    let bstr = atob(imgUrl.split(",")[1]);
    let n = bstr.length;
    let u8arr = new Uint8Array(n);
    while (n--) {
     u8arr[n] = bstr.charCodeAt(n);
    }
    let blob = new Blob([u8arr]);
    window.navigator.msSaveOrOpenBlob(blob, "chart-download" + "." + "png");
   } else {
    // 这里就按照chrome等新版浏览器来处理
    let a = document.createElement("a");
    a.href = imgUrl;
    a.setAttribute("download", "chart-download");
    a.click();
   }
  }
 }
};
</script>

2.ok,ie的问题解决了,但是火狐的又不行了

2-3. 兼容方法

1.结合上面两种检测方法,我们只要可以判断浏览器是火狐,然后单独处理就可以实现我们的兼容性了

<template>
 <div>
  <a
   v-if="!isFirefox"
   @click.stop.prevent="handleDownloadQrIMg"
   class="qrcode"
  >
   <img src="static/img/load.png">
  </a>
  <a
   v-if="isFirefox"
   :href="prefixBase64 + qrBase64" rel="external nofollow" rel="external nofollow" 
   download="qrcode.png"
   class="qrcode"
  >
   <img src="static/img/load.png">
  </a>
 
 </div>
 
</template>
 
<script>
export default {
 data() {
  return {
   qrBase64: "", // 二维码对应的base64(在方法里面进行获取)
   prefixBase64: "data:image/png;base64,", // base64前缀
   isFirefox: false
  };
 },
 mounted() {
  // 判断浏览器是否是火狐
  if (navigator.userAgent.indexOf("Firefox") > 0) {
   this.isFirefox = true;
  }
 },
 methods: {
  // 点击下载图片
  handleDownloadQrIMg() {
   // 这里是获取到的图片base64编码,这里只是个例子哈,要自行编码图片替换这里才能测试看到效果
   const imgUrl = this.prefixBase64 + this.qrBase64;
   // 如果浏览器支持msSaveOrOpenBlob方法(也就是使用IE浏览器的时候),那么调用该方法去下载图片
   if (window.navigator.msSaveOrOpenBlob) {
    let bstr = atob(imgUrl.split(",")[1]);
    let n = bstr.length;
    let u8arr = new Uint8Array(n);
    while (n--) {
     u8arr[n] = bstr.charCodeAt(n);
    }
    let blob = new Blob([u8arr]);
    window.navigator.msSaveOrOpenBlob(blob, "chart-download" + "." + "png");
   } else {
    // 这里就按照chrome等新版浏览器来处理
    let a = document.createElement("a");
    a.href = imgUrl;
    a.setAttribute("download", "chart-download");
    a.click();
   }
  }
 }
};
</script>

以上就是vue 通过base64实现图片下载功能的详细内容,更多关于vue 图片下载的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue在图片上传的时候压缩图片
Nov 18 Vue.js
Vue开发中常见的套路和技巧总结
Nov 24 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
vue 动态创建组件的两种方法
Dec 31 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
详解实现vue的数据响应式原理
Jan 20 Vue.js
Vue 数据响应式相关总结
Jan 28 Vue.js
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 Vue.js
Vue中computed和watch有哪些区别
Dec 19 #Vue.js
Vue与React的区别和优势对比
Dec 18 #Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 #Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 #Vue.js
vue 数据操作相关总结
Dec 17 #Vue.js
Vue 组件注册全解析
Dec 17 #Vue.js
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 #Vue.js
You might like
PHP 字符串分割和比较
2009/10/06 PHP
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
php中filter_input函数用法分析
2014/11/15 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
JS event使用方法详解
2008/04/28 Javascript
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
Move.js入门
2017/02/08 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
护士感人事迹
2014/05/01 职场文书
关爱老人标语
2014/06/21 职场文书
人大调研汇报材料
2014/08/14 职场文书
平安建设汇报材料
2014/12/29 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
php png失真的原因及解决办法
2021/10/24 PHP