HTML中dom转成图片进行存储

HTML中dom转成图片进行存储

月光魔力鸭

2018-12-05 13:17 阅读 1355 喜欢 3 html转图片 html2canvas

最近在做试卷相关的业务,碰到一个场景,需要将试卷在移动端进行卷面还原,考虑到在WEB端实现的A4的样式在移动端上不好实现且比较难看,最终选择通过图片进行预览,这样在移动端也可以进行缩放查看。

业务流程

流程比较简单,下面主要说下关于图片生成以及保存这部分的实现。

使用插件

html2canvas canvas转图片 图片上传保存

html2canvas

该插件可以实现,将某些HTML中的dom转化成canvas进行展现,使用非常简单,而且还原度相当高。 插件地址:undefined

使用起来超级简单:

html2canvas(document.querySelector("#capture")).then(canvas => {
    document.body.appendChild(canvas)
});

将canvas生成图片

代码如下:

let dataurl = canvas.toDataURL('image/png');

上面是将canvas转成base64的字符串,下面将字符串转成form表单中的File对象,然后通过异步将文件保存。

let dataurl = canvas.toDataURL('image/png');
let arr = dataurl.split(',');
let mime = arr[0].match(/:(.*?);/)[1];
let suffix = mime.split('/')[1];
let bstr = atob(arr[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
  u8arr[n] = bstr.charCodeAt(n)
}
//生成File对象
let file = new File([u8arr], `preview.${suffix}`, {type: mime});
let fd = new FormData();
fd.append("file",file);
fd.append("module","preview");
$.ajax({
	type : 'post',
	url : base+'/file/upload',
	data : fd,
	processData: false,
	contentType:false,
	success : function(res){
		if(res.success){
			resolve(res);
		}else{
			reject(res.msg);
		}
	},
	error : function(e){
		reject("图片信息保存失败,请刷新后重试!");
	}
});

关于后台接受

至于下面后端接收图片并处理的这里简单放下代码就不说明了,我这是传到了FTP服务器上保存的,后端是基于spring-boot框架实现的。

/**
 * 单文件上传
 *
 * @param file
 * @param request
 * @return
 */
@PostMapping("/upload")
@ResponseBody
public Map upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
	//返回MAP 给前台数据使用
	String module = request.getParameter("module");
	Map map = new HashMap();
    if (!file.isEmpty()) {
		try {
			String fileName = file.getOriginalFilename();
        	Attachment attach = new Attachment();
    		attach.setId(new Uuid().getUUID());
    		attach.setSystem("smartteaching");
    		attach.setFileName(fileName);
    		attach.setModule(module);
    		attach.setSuffix(FileUtil.getFileExt(fileName));
    		FtpStorageHandlerImpl fshl = new FtpStorageHandlerImpl();
    		fshl.upload(file.getInputStream(), attach);
			map.put("filePath", attach.getFilePath());
			map.put("fileSize", file.getSize());
			map.put("fileName", attach.getFileName());
			map.put("suffix", attach.getSuffix());
			map.put("success", true);
		} catch (IOException e) {
			e.printStackTrace();
			map.put("success", false);
			map.put("msg", "上传失败");
		}

		return map;
    } else {
    	map.put("success", false);
    	map.put("msg", "文件不存在或为空");
        return map;
    }
}

结束

到了这一步,完整的从前端将DOM生成图片,并将图片上传至后端就完成了。

转载请注明出处: https://chrunlee.cn/article/html-2-canvas-png.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
偶尔练习下canvas,这里简单记录下常用API,防止遗忘..加深记忆..努力提高..争取突破...daydayup
新增需求:在tinymce上增加一个着重号的插件
关于jquery,他的核心特点就是无new构造和链式调用,这里根据网上的资料,自己简单理解下,有助于消化核心代码。
通过修改数据库编码处理存储emoj表情导致的报错问题。
今天刷codewars的题目的时候碰到一个通过js来实现字符串转base64的题目,base64虽然在js或nodejs中经常用,但是我还真没有仔细去看过原理以及如何实现,这回绕不过去了,赶紧找了找资料看了下。
我们经常会有判断一个数值是素数的需求,那么我们如何来实现呢?
之前一直没面试过前端,今天有一个,先整理下需要问的问题和答案。这里都是一些简单的问题,关于当下比较流行的框架并没有涉及到..
通过canvas可以进行画图实现一些动画效果等,今天练习下通过canvas来实现一个简易的电子画板,可以在白板上进行画画,然后指定不同的颜色、线条粗细,加载不同的背景以及擦除效果。