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"
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"
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>

通过base64实现图片下载功能(基于vue)的更多相关文章

  1. 写了一个兼容IE9的图片放大器(基于vue)

    photoloupe 图片放大器 第一次写vue插件,本人比较喜欢用简单易懂的写法,不喜勿喷. 本插件支持IE9及以上版本,已经过验证. 本插件可根据需要设置放大倍数,最小支持1倍,支持小数 下载地址 ...

  2. 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果

    基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...

  3. html转化为图片下载

    业务需求:按照客户要求把排课表转化为图片下载到本地.一个月到排课有很多.所以图片会很大 <!DOCTYPE html> <html lang="en"> & ...

  4. iOS学习笔记之异步图片下载

    写在前面 在iOS开发中,无论是在UITableView还是在UICollectionView中,通过网络获取图片设置到cell上是较为常见的需求.尽管有很多现存的第三方库可以将下载和缓存功能都封装好 ...

  5. ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)

    ABBPlayerKit ios开发视频播放后台下载功能实现 : 代码下载地址:https://github.com/niexiaobo/ABBPlayerKit github资料学习和下载地址:ht ...

  6. vue.js如何根据后台返回来的图片url进行图片下载

    最近在做一个前端vue.js对接的功能模块时,需要实现一个下载图片的功能,后台返回来的是一串图片url,试了很多种方法,发现点击下载时出来的效果都是跳着到一个新的图片网页,后来经过一番琢磨,终于解决了 ...

  7. java开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片

    因为业务的需要,公司产品要求商品详情页面有个下载的功能 找了很多的方法,发现有的需要打开一个新窗口,而且在某些浏览器上不适用,所以继续寻找更好的方法 跟同事沟通后发现他那里有个下载的方法,不过是C#写 ...

  8. C#实体图片下载与批量下载(自动保存功能)

    新工作,第一个小任务,制作一个点击下载图片的功能.并提供批量下载操作.图片是字节流的形式,存放在数据库中的. 为了避免直接从数据库中,下载失败,会在本地保存一份. 进行压缩的是SharpZip这个压缩 ...

  9. 手把手教你写基于C++ Winsock的图片下载的网络爬虫

    手把手教你写基于C++ Winsock的图片下载的网络爬虫 先来说一下主要的技术点: 1. 输入起始网址,使用ssacnf函数解析出主机号和路径(仅处理http协议网址) 2. 使用socket套接字 ...

随机推荐

  1. JSP中调用Spring的方法

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. vue 初始化rem

    在assets => js => rem.js export default { init () { let sw = document.documentElement.clientWid ...

  3. javascript基本类型及类型转换

    每种语言都有自己的基本类型,javascript也不例外.在javascript中有五大基本类型,分别是number,string,boolean,null,undefined.其他不属于这五种基本类 ...

  4. Java——类之间的关系

    3.7 类之间的关系 3.7.1 泛化关系 类和类之间的继承关系及接口与接口之间的继承关系. 3.7.2 实现关系 类对接口的实现. 3.7.3 关联关系 类与类之间的连接,一个类可以知道另一个类的属 ...

  5. Python实现中英文翻译方法总结

    #Author:Chenglong Qian #Copyright :Chenglong Qian import json import requests import re import os im ...

  6. js 获取数组中的最大值和最小值

    var arr = [3,12,23,18,25,33,22,30,1] 方案一: 思想 首先对数组进行排序(小 >大),第一项为最小值,最后一项为最大值 var min; var max; a ...

  7. Servlet源码分析

    Servlet API的核心就是javax.servlet.Servlet接口,所有的Servlet 类(抽象的或者自己写的)都必须实现这个接口.在Servlet接口中定义了5个方法,其中有3个方法是 ...

  8. Bagging vs Boosting vs Stacking

    原文地址:https://www.jianshu.com/p/9dacdc88d3ec Bagging 用于减小方差. 使用训练数据的不同随机子集(大小常等于训练数据,采用不放回的方式进行抽取)来训练 ...

  9. SPOJ MAXMATCH - Maximum Self-Matching (FFT)

    题目链接:MAXMATCH - Maximum Self-Matching Description You're given a string s consisting of letters 'a', ...

  10. Ubuntu12.04下Encountered a section with no Package: header错误解决方案

            刚刚想在Ubuntu12.04下安装几个软件,sudo apt-get install libsqlite3-dev automake scratchbox2,没成想出现下面的错误: ...