业务需求:按照客户要求把排课表转化为图片下载到本地。一个月到排课有很多。所以图片会很大
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>html2canvas_download</title> <style> </style> </head> <body> <div id="image" style="width: 300px; height: 300px; margin: 10px; background: red; border: 5px solid gray;"> <h1>hello world!</h1> <h3>内容超级多,高度可能是一万多像素</h3> </div> <div id="imageExport">down</div> </body> <!--<script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.min.js"></script>--> <script src="/canvastohtml/canvasToHtml.js"></script> <script type="text/javascript"> $("#imageExport").click(function () { initExportImage(); }); function initExportImage() { //要导出的html的内容 var oDiv = document.getElementById('image'); html2canvas(oDiv).then(function (canvas) { /* 1. 创建要导出的html的容器 let htmlElement = document.createElement('div'); htmlElement.id = 'imageExportDiv'; htmlElement.style.display = 'none'; document.body.appendChild(htmlElement); //把要导出的html转化为canvas,然后渲染到容器中,实际导出的图片就是我的容器中的canvas document.getElementById("imageExportDiv").appendChild(canvas); */
/* var strDataURI = canvas.toDataURL('image/jpeg',0.1);//调小就可以了.图片太大总是发生网络错误的问题 downLoadFn(strDataURI);*/ /*2。下载图片,图片的大小比较小 推荐使用*/ downloadFile(canvas.toDataURL('image/png',1),"aa.png") }); } /*解码后转化为blob使用,可以把base64的大文件变为小文件,下载就不会出现错误了*/ function downloadFile(content, fileName) { //下载base64图片 var base64ToBlob = function(code) { let parts = code.split(';base64,'); let contentType = parts[0].split(':')[1]; let raw = window.atob(parts[1]); let rawLength = raw.length; let uInt8Array = new Uint8Array(rawLength); for(let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], { type: contentType }); }; let aLink = document.createElement('a'); let blob = base64ToBlob(content); //new Blob([content]); let evt = document.createEvent("HTMLEvents"); evt.initEvent("click", true, true); //initEvent 不加后两个参数在FF下会报错 事件类型,是否冒泡,是否阻止浏览器的默认行为 aLink.download = fileName; aLink.href = URL.createObjectURL(blob); //aLink.click();
aLink.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));//兼容火狐
};
function downLoadFn(url) { if (myBrowser() === "IE" || myBrowser() === "Edge") { SaveAs5(url); } else { download(url); } } //判断浏览器类型 function myBrowser() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 var isOpera = userAgent.indexOf("Opera") > -1; if (isOpera) { return "Opera" } ; //判断是否Opera浏览器 if (userAgent.indexOf("Firefox") > -1) { return "FF"; } //判断是否Firefox浏览器 if (userAgent.indexOf("Chrome") > -1) { return "Chrome"; } if (userAgent.indexOf("Safari") > -1) { return "Safari"; } //判断是否Safari浏览器 if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) { return "IE"; } ; //判断是否IE浏览器 if (userAgent.indexOf("Trident") > -1) { return "Edge"; } //判断是否Edge浏览器 } //IE浏览器图片保存本地 function SaveAs5(imgURL) { var oPop = window.open(imgURL, "", "width=1, height=1, top=5000, left=5000"); for (; oPop.document.readyState != "complete";) { if (oPop.document.readyState == "complete") break; } oPop.document.execCommand("SaveAs"); oPop.close(); } // chrome14+,firefox20+,pera15+,Edge 13+,Safari未实现 function download(strDataURI) { //创建一个下载的a标签 var link = document.createElement('a'); //设置a标签的文字<a>下载</a> link.innerHTML = '导出'; //下载的图片的名称 link.download = 'coursePlan.png'; link.id = 'aa'; //a标签的点击事件 link.addEventListener('click', function (ev) { link.href = strDataURI; }, false); //$("#imageExport").html(link);//可以把创建的a标签放到指定的标签中 //直接下载,文件图片太大会出现问题,出现网络问题,下载出错 link.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));//兼容火狐 //link.click();//直接点击也可 }; </script> </html>
ps:使用时候出现的问题
粉色部分代码使用暂时没有遇到问题
绿色部分使用会出现问题,如果转换下载的图片 71M 使用了base64的图片下载,下载的图片就很大,具体原因未知。每次都会出现问题,下不下来。
下载失败 网络问题
图片有时候下载出来,底部的一部分数据会消失
这个问题是因为图片太大还没有渲染完,如果想要下载完成的图片,需要拉动滑动条,看到完成的图片,然后等等不要页面加载完,就下载,需要等一会10秒或者等等,才可以下载完整图片