有没有小伙伴在开发“纯前端下载图片”性能时,遇到以下的场景?
1. 下载已存在的图片2. 下载某个元素的内容
分享解决以上问题的办法
- 下载已存在的图片:应用canvas画图,a标签下载
export function downloadImg(imgUrl: string, imgTitle: string) { var img = new Image(); img.src = imgUrl; // 必须设置,否则canvas中的内容无奈转换为blob img.setAttribute('crossOrigin', 'Anonymous'); img.onload = function () { var canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; let ctx: any = canvas.getContext('2d'); // 将img中的内容画到画布上 ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 将画布内容转换为Blob canvas.toBlob(blob => { // blob转为同源url var blobUrl = window.URL.createObjectURL(blob); // 创立a链接 var a = document.createElement('a'); a.href = blobUrl; a.download = imgTitle || '下载图片'; // 设置图片名称 // 触发a链接点击事件,浏览器开始下载文件 a.click(); }); };}
下载某个元素的内容:应用html2canvas插件进行截图,a标签下载
官网:http://html2canvas.hertzen.com/// 引入html2canvasimport html2canvas from 'html2canvas';// 下载凭证按钮const downLoadBtn = () => { // 获取dom节点 const downLoadDom: any = document.getElementById("downLoadDom"); html2canvas(downLoadDom, { width: downLoadDom.offsetWidth, height: downLoadDom.offsetHeight, scale: 2, }).then((canvas) => { const imgBase64 = canvas.toDataURL('image/png'); downLoadMethod(imgBase64); });}// 下载图片const downLoadMethod = (url: any) => { var oA = document.createElement("a"); oA.download = '下载图片'; oA.href = url; oA.className = "downLoad" document.body.appendChild(oA); oA.click(); oA.remove();}
留神
- html2canvas图片跨域问题,可参考文档
https://blog.csdn.net/qq_3890...
附送
将base64图片转化为formData并上传办法
// 将base64图片转化为formData并上传export async function transferBase64ToImg(base64String: any) { var bytes = window.atob(base64String.split(',')[1]); var array = []; for (var i = 0; i < bytes.length; i++) { array.push(bytes.charCodeAt(i)); } var blob = new Blob([new Uint8Array(array)], { type: 'image/jpeg' }); var formData = new FormData(); formData.append('file', blob, Date.now() + '.jpg'); let res = await API.edit.uploadImage(formData); return res.fullPath;}