在网上查了很多资料,发现很多都是html+js,jquery实现图片下载的,于是整理了一份在vue中下载的方式,总结如下:

一、使用axios下载同源图片

原理:创建一个a标签并隐藏掉,将axios返回的图片路径赋值给href,a标签的dowmload属性不设置时浏览器会直接打开href路径,设置了之后会强制将文件下载下来,我们就用这一方式下载图片,加载完之后再将a标签移除,此方式只针对同源图片。

<el-button type="primary" @click="handleDownload(this.imgurl,'photo.jpg')">下载同源图片</el-button>

js代码:

import axios from 'common/js/axios'  // 引入配置的axios// imgUrl为图片路径,fileName为文件名
handleDownload(imgUrl, fileName){axios.get(imgUrl, { responseType: 'arraybuffer' }).then((res) => {const blob = new Blob([res.data])const blobUrl = window.URL.createObjectURL(blob)// 创建a标签并隐藏 设置标签属性为download时会强制下载const a = document.createElement('a')a.style.display = 'none'a.href = blobUrla.setAttribute('download', fileName)// 清除a标签document.body.appendChild(a)a.click()document.body.removeChild(a)window.URL.revokeObjectURL(blobUrl)})
}

二、创建canvas下载跨域图片

原理:当图片域名跟当前域名不同时,创建一个canvas,把图片转成base64的格式,再赋值给a标签,就可以下载了。

<el-button type="primary" @click="handleDownload(this.imgurl,'photo.jpg')">下载跨域图片</el-button>

js代码:

// 下载点击事件
handleDownload(this.imgUrl, 'photo.jpg').then(() => {this.$message.success('成功下载1张图片!')
})// 下载图片
downloadImg(imgsrc, fileName) {let image = new Image()// 解决跨域 Canvas 污染问题image.setAttribute('crossOrigin', 'anonymous')image.onload = function() {let canvas = document.createElement('canvas')canvas.width = image.widthcanvas.height = image.heightlet context = canvas.getContext('2d')context.drawImage(image, 0, 0, image.width, image.height)let url = canvas.toDataURL('image/png') // 得到图片的base64编码数据let a = document.createElement('a') // 生成一个a元素let event = new MouseEvent('click') // 创建一个单击事件a.download = fileName || 'photo' // 设置图片名称a.href = url // 将生成的URL设置为a.href属性a.dispatchEvent(event) // 触发a的单击事件}image.src = imgsrcreturn Promise.resolve()
}

三、将多个图片打包成zip,下载下来

用到的插件:

npm install jszip

npm install file-saver

<el-button type="primary" @click="handleDownloadAll(this.imgList)">下载所有图片</el-button>

js代码:

    // 引入插件import JSZip from 'jszip'import { saveAs } from 'file-saver'// 批量下载图片handleDownloadAll(imgList) {const that = thisvar imgBase64 = []var imageSuffix = [] // 图片后缀var zip = new JSZip()var img = zip.folder('文件夹名')for (var i = 0; i < imgList.length; i++) {// 获取每个图片的后缀var suffix = imgList[i].substring(imgList[i].lastIndexOf('.'))imageSuffix.push(suffix)this.getBase64(imgList[i]).then(base64 => {imgBase64.push(base64.substring(22))}, err => {console.log(err) // 打印异常信息})}function tt () {setTimeout(function () {if (imgList.length === imgBase64.length) {for (var i = 0; i < imgList.length; i++) {// 设置文件名img.file(i + imageSuffix[i], imgBase64[i], { base64: true })}zip.generateAsync({ type: 'blob' }).then(function (content) {// see FileSaver.jssaveAs(content, '压缩包名.zip')that.$message.success(`成功下载${imgList.length}张图片!`)})} else {tt()}}, 100)}tt()},getBase64 (img) {// width、height调用时传入具体像素值,控制大小 ,不传则默认图像大小function getBase64Image (img, width, height) {var canvas = document.createElement('canvas')canvas.width = width || img.widthcanvas.height = height || img.heightvar ctx = canvas.getContext('2d')ctx.drawImage(img, 0, 0, canvas.width, canvas.height)var dataURL = canvas.toDataURL()return dataURL}return new Promise((resolve) => {var image = new Image()image.crossOrigin = 'Anonymous'image.src = imgif (img) {image.onload = function () {// 读取图片之后的操作resolve(getBase64Image(image))}}})},

vue下载图片常见问题,解决vue中下载同源图片、跨域图片,以及打包下载多个跨域图片相关推荐

  1. vue重复路由_解决vue路由name同名,路由重复的问题

    在项目中,想让路由后缀为空,或者index的时候,都跳转到路由为index的页面,于是在router中如下配置 routes: [{ path: '/', name: 'index', compone ...

  2. vue index.html 缓存,解决vue单页面 回退页面 keeplive 缓存问题

    场景:项目中遇到 vue 点击回退 从A页跳到B页,缓存A页,当B页状态修改再次返回A时,A页查询条件缓存不刷新,列表刷新 A页: B页: 解决方法: 利用keep-alive 缓存需要缓存的页面 1 ...

  3. vue index.php,如何解决vue $index报错问题

    vue $index报错是因为vue已经移除了原来的$index和$key用法,变成了index和key,其解决办法就是修改$index和$key为index和key即可. 本教程操作环境:windo ...

  4. 天庭最牛系统 推荐下载_围观RecSys2020 | 推荐系统顶会说了啥?(附论文打包下载)...

    RecSys2020主页:RecSys – ACM Recommender Systems(https://recsys.acm.org/) 小编整理了RecSys2020的文章,其中包括41篇Lon ...

  5. 在PPT2007中制作礼花绽放动画效果ppt模板打包下载

    家家户户都有除夕放烟花的习惯,尤其是一些小地方城市,过节礼花那是必不可少的. 毕业论文ppt背景放礼花可以增添节日的喜庆气氛,但是大家也需要注意自身安全,下面简单介绍一下礼花绽放动画效果的制作. 1. ...

  6. vue产生二维码并且打包下载

    在做一个二开项目,前端使用的vue element-ui. 需求要在列表里面展示二维码,并且可以批量打包下载. 首先我们能确定 在接口里面返回的是二维码链接 展示二维码 1. 在el-table中加入 ...

  7. git的镜像下载地址,解决下载慢的问题

    想看更多算法题,可以扫描上方二维码关注我微信公众号"数据结构和算法",截止到目前我已经在公众号中更新了500多道算法题,其中部分已经整理成了pdf文档,截止到目前总共有800多页( ...

  8. java文件下载功能代码(单文件下载、多文件批量打包下载)——普遍适用

    一.前言   程序员在做web等项目的时候,往往都需要添加文件上传.下载.删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计 ...

  9. 实现多个存储服务器上文件浏览器打包下载

    关于本地文件zip打包返回给浏览器下载,这边有个很好的例子读取本地文件打包返回给浏览器下载,基本能解决的相关问题.而最近因为项目原因,打包返回给浏览器下载的是存储在fdfs上文件,然后对此代码修改了下 ...

  10. 缩放图片,解决bitmap 内存溢出out of memory的问题

    缩放图片,解决bitmap 内存溢出out of memory的问题 参考文章: (1)缩放图片,解决bitmap 内存溢出out of memory的问题 (2)https://www.cnblog ...

最新文章

  1. UOJ#272. 【清华集训2016】石家庄的工人阶级队伍比较坚强
  2. codevs 3054 高精度练习-文件操作
  3. 使用 apiDoc 为你的Node.js API 生成文档
  4. maven jpa_使用Hibernate 4,JPA和Maven的架构创建脚本
  5. Oracle On Linux
  6. 中国三大运营商发声!要求纽交所复议退市决定
  7. hadoop启动_hadoop服务快速部署
  8. 常见电平转换电路设计参考
  9. VBOT - PHP 个人微信号群管理机器人
  10. 基于jsp的学生培训管理系统
  11. 易语言 设置屏幕刷新率 源码_下任安卓机皇曝光,领先iPhone 12屏幕一年!
  12. 计算机毕业设计Java宠物收养管理系统(源码+系统+mysql数据库+lw文档)
  13. 常见的内存错误java_Java虚拟机常见内存溢出错误汇总,Java中常见的坑看了可以少走点弯路...
  14. 【React】React Js入门教程(一学就会)
  15. 【论文阅读】SISR综述:From Beginner to Master: A Survey for Deep Learning-based Single-Image Super-Resolution
  16. 强一致性 弱一致性 最终一致性
  17. c++裸函数naked解析
  18. Java反射机制的基本认识
  19. 数字化转型2.0落地的正确姿势 | 人物志
  20. DolphinPHP(海豚PHP) 框架 Excel 插件 《导出 Excel 教程》

热门文章

  1. 2020-09-12
  2. Wemos D1 Mini / nodeMcu / esp8266 + GUIslice库 驱动ST7789 TFT显示屏
  3. EXCEL将汉字转化为拼音简写
  4. SpringBoot之SpringData JPA的基本使用
  5. Java实现 LeetCode 383 赎金信
  6. HTML CSS大学生期末网页大作业 DW个人网页设计 人物介绍 历史人物岳飞介绍
  7. pdf.js插件在线预览pdf文件以及所遇问题解决方案(兼容IE)
  8. vue之使用 vue-pdf插件
  9. meshlab调整平行光源
  10. Java多线程系列--“JUC锁”04之 公平锁(二)