Html5截屏功能,后台保存

项目中需要实现HTML5截屏功能,通过html2canvas.js完成前端截图,并以base64格式发送到后台。原博文中提供的html2canvas.js可能存在远程访问问题,建议本地保存使用。在后台解析base64图片时,不推荐使用sun.misc.BASE64Decoder,推荐使用commons-codec-1.10.jar进行解析。在实际操作中,遇到html2canvas截屏时样式丢失的问题,原因是CSS3样式未写入兼容性样式导致。

最近项目需要做截屏功能,然而不是做APP调用设备截屏,所以截图通过HTML来实现,经过查询资料,记录一下。 

资料来源 https://blog.csdn.net/qq_27818157/article/details/53195933

由于远程JS html2canvas.js 可能访问不到,所以https://blog.csdn.net/gongqinglin/article/details/78563901提供了html2canvas.js源码。(整一份copy出来,创建一个html2canvas.js即可)

 

这里直接下载这个js

链接: https://pan.baidu.com/s/19njUZ5wTjjYnXgTtY2-Uug

提取码: v451

 

前端

前端调用js的方法,将生成图片以base64格式传输到后台

<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="html2canvas.js"></script>

//截屏
$("#screenBtn").on("click", function(event) {
	event.preventDefault();
	html2canvas(document.body, {
		allowTaint: true,
		taintTest: false,
		onrendered: function(canvas) {
			canvas.id = "mycanvas";
			//生成base64图片数据
			var dataUrl = canvas.toDataURL();
			var newImg = document.createElement("img");
			newImg.src =  dataUrl;
			var pos = dataUrl.indexOf("4")+2;
			dataUrl = dataUrl.substring(pos, dataUrl.length - pos);//去掉Base64:开头的标识字符
			$.ajax({
				type: "POST",
					url:"",
					async: false,
					data: { 'base64StrImgData': dataUrl},
					dataType: "text",
					beforeSend: function (request) {
				},
				success: function (data) {
				
				}
			});
		}
	});
});

 

 

 

后台

对于后台,该博客使用的是sun.misc.BASE64Decoder.jar来解析Base64图片URL。但在项目构建过程中,发现Sun公司的sun.misc.BASE64Decoder.jar是非开源jar包,在maven库没有该包,而且通过资源显示说sun.misc.BASE64Decoder该包安全性不高、又没有开源,所以十分不推荐使用。

所以解析Base64图片URL的时候,使用另外一个jar包解析commons-codec-1.10.jar。注意不要使用到JDK的包,可能由于项目迁移JDK版本不一样或不存在而报错。

以下是主要的后台保存图片代码。

// Base64解码
org.apache.commons.codec.binary.Base64 base64 = new org.apache.commons.codec.binary.Base64();
byte[] bytes = base64.decode(base64StrImgData);
//图片流输出到本地某个位置
OutputStream o = new FileOutputStream("a.jpg");
o.write(bytes);
o.flush();
o.close();

 

maven pom.xml配置

<dependencies> 
    <!-- Base64编码需要 --> 
    <dependency> 
        <groupId>org.apache.commons</groupId> 
        <artifactId>codec</artifactId> 
        <version>1.10</version> 
        <scope>system</scope> 
        <systemPath>${project.basedir}/lib/commons-codec-1.10.jar</systemPath> 
    </dependency> 
</dependencies>

 

对于遇见的一个奇葩问题

我遇到了html2canvas截屏时丢失样式的问题。

但搜索发现出现此问题提问的贴都没有人回答, 经过自己的研究总结发现是由于我使用了CSS3的样式没有写入浏览器兼容性样式,导致截屏时样式解析出错(这也是自己写的前端考虑不够周全的问题)。样式应该考虑到兼容性问题,例:

background-image: -webkit-gradient(linear,left top,left bottom,from(#fff),to(#fff));
background-image: -webkit-linear-gradient(#fff,#fff);
background-image: -moz-linear-gradient(#fff,#fff);
background-image: -ms-linear-gradient(#fff,#fff);
background-image: -o-linear-gradient(#fff,#fff);
background-image: linear-gradient(#fff,#fff);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值