前端打包下载图片

前段时间pc端的一个需求,需要将图片打包下载到本地,于是就开始网上各种搜,折腾了几天,看了各种版本,最终自己整合后,终于实现功能。

刚开始的时候,则是想着实现能下载图片到本地,则想到使用a标签下载

let a = document.createElement('a'); //创建一个a节点
let e = new MouseEvent('click'); // 模拟点击事件
let url = './1.png'; //
a.download='下载图片'; // 给a设置download属性
a.href = url
a.dispatchEvent(e)   // 触发点击事件

但是却发现,确下载不了,原来这样只能是同源的图片的才能保存,由于项目的图片地址时阿里云oss上的,所以只能舍弃,便在网上各种找,终于找到非同源图片保存的方法,参考了(https://juejin.im/post/5c8882fd5188257a323f5d63)这篇文章后,最后还是不能解决跨域报错问题。最终各种尝试,发现一个问题,即改变浏览器缓存图片的路径,所有问题便解决了

1、我们项目的图片地址来源是阿里云,所以在阿里云oss设置允许跨域: Access-Control-Allow-Orign: *
2、则前端js代码
	downLoadImg(url) {
		let img = new Image();
    	// 解决跨域 canvas污染问题
    	image.setAttribute('crossOrign', 'anonymous')
    	image.onload = function() {
        	let canvas = document.createElement('canvas')
        	canvas.width = image.width
        	canvas.height = image.height
        	let 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')
        	let e = new MouseEvent('click')
        	a.download = '下载图片'
        	a.href = url
       	 	a.dispatchEvent(e)
    	}
    	 image.src = imgUrl  + '?t'
	}
	为什么加图片路径后加***t***?
1、js中new 出来的img对象加上crossorigin属性,是让图片按照cors请求图片,这样图片可以到canvas上进行绘制的

2、html中img标签( <img src="图片路径" alt />)加载时,浏览器会将其缓存,若img标签未设置crossorigin,点击下载图片时,还是会报跨域问题的错误,这是由于js创建的img直接访问的是缓存的图片,而js中又设置里crossorign属性,则它要以CORS的方式请求,但缓存中的图片丙不是,所以浏览器会报错

3、我解决2中的问题是在img标签中也设置crossorign属性,确实,可以下载图片到本地,但是,又引来新的问题,图片在网页上不能显示出来

4、所以最后,让图片既能显示又能不报错,即img标签不设置crossorign属性,js中访问图片的路径加上**t**,即不是浏览器缓存的路径,就可以啦

由于需求是需要打包下载,安装打包文件的插件即可,项目是基于vue的,所以

1、安装插件 npm install jszip --save    
            npm install flie-saver --save
2、在需要用的文件里引入
    import JSZip from 'jszip'
    import FileSaver from 'file-saver'
           

参考文章:https://juejin.im/post/5c8882fd5188257a323f5d63

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值