HTML中dom转成图片进行存储

HTML中dom转成图片进行存储

月光魔力鸭

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

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

业务流程

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

使用插件

html2canvas canvas转图片 图片上传保存

html2canvas

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

使用起来超级简单:

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


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
突然来了一个调研任务,想要实现一个类似3D虚拟展厅类似的需求,主要就是放一些学生的作品,然后预览啥的,效果还是要全景的效果。 经过一番调查,最终锁定了以前从未接触过的krpano。
在今天之前,我对canvas中rotate其实是一脸蒙逼的... 虽然之前有做过图片旋转,但那是在他人的基础上直接修改的,至于为啥会这样..讲真,还真没注意过,但是今天又需要用到这块了,实在搞不定了,找了各种资料,终于明白了.. 坐标系的问题。
web网站上总会有在文本域中提交代码的操作,那么如何处理呢?
jsQR 是一款纯粹的由javascript实现的二维码识别库,可以在浏览器端使用,也可以在后端node.js环境使用。我之前使用过其他的识别库,例如:qrcode-reader 或其他,在使用上都比较麻烦,而且识别率并不高。jsQR是后来发现的,感觉(没有实际对比验证)jsQR识别率要更高些,使用起来也更简单,不需要安装其他依赖软件。
前端时间搞了个小转码,放在后台,但是特别占带宽,想着能不能从前台把这个事搞定呢?读取图片的二进制,然后将字节流处理后重新生成图片展示处理啊。
在我们通过canvs画图的时候经常会用到圆,且需要计算出圆上某点的坐标,由于我数学没学好,总是记不得怎么获取,这里记录下,加深记忆
本文概括了递归、闭包、原型、继承,理清这些基本的概念,有助于你接纳更多的东西,我们会在下一个章节对函数进行更深入的讨论。
在页面中不同的frame之间进行相互调用的话,我们可以通过frame获取对应的window然后进行调用,但是如果是浏览器不同的tab之间呢?