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使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
梳理一下vue中的生命周期
Dec 30 Vue.js
Vue详细的入门笔记
May 10 Vue.js
Vue实现动态查询规则生成组件
May 27 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
在vue中import()语法不能传入变量的问题及解决
Apr 01 Vue.js
使用vue判断当前环境是安卓还是IOS
Apr 12 Vue.js
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
vue中data里面的数据相互使用方式
Jun 05 Vue.js
vue el-table实现递归嵌套的示例代码
Aug 14 Vue.js
Vue router配置与使用分析讲解
Dec 24 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下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
python交互界面的退出方法
2019/02/16 Python
python实现简单图片物体标注工具
2019/03/18 Python
python mysql断开重连的实现方法
2019/07/26 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
皮肤科医师岗位职责
2013/12/04 职场文书
机关门卫制度
2014/02/01 职场文书
销售经理竞聘书
2014/03/31 职场文书
作风转变年心得体会
2014/10/22 职场文书
php实现自动生成验证码的实例讲解
2021/11/17 PHP