html2canvas实现页面截图并使用axios上传

简介: html2canvas实现页面截图并使用axios上传

文档:

https://html2canvas.hertzen.com/

安装

npm install --save html2canvas

1、简单实例

点击按钮截取id=capture 的元素

<template>
  <div id="capture" style="padding: 10px; background: #f5da55">
    <h4 style="color: #000; ">Hello world!</h4>
    <button @click="screenshots">screenshots</button>
  </div>
</template>
<script>
import html2canvas from "html2canvas";
export default {
  methods: {
    screenshots() {
      html2canvas(document.querySelector("#capture")).then(canvas => {
        document.body.appendChild(canvas);
      });
    }
  }
};
</script> 
<template>
  <div id="capture" style="padding: 10px; background: #f5da55">
    <h4 style="color: #000; ">Hello world!</h4>
    <button @click="screenshots">screenshots</button>
  </div>
</template>
<script>
import html2canvas from "html2canvas";
export default {
  methods: {
    screenshots() {
      html2canvas(document.querySelector("#capture")).then(canvas => {
        document.body.appendChild(canvas);
      });
    }
  }
};
</script> 

生成的图片可以右键保存

13.2.png

2、问题:截图不全

如果在vue项目中出现问题:截图不全,

可以通过生成虚拟dom的方法解决

代码如下

<template>
  <div
    id="capture"
    ref="imageDom"
    style="padding: 10px; background: #f5da55;height:1000px;width100%"
  >
    <h4 style="color: #000;">Hello world!</h4>
    <button @click="screenshots">screenshots</button>
  </div>
</template>
<script>
import html2canvas from "html2canvas";
export default {
  methods: {
    screenshots() {
      let imageDom = this.$refs.imageDom;
      var width = imageDom.style.width;
      var cloneDom = imageDom.cloneNode(true);
      // 设置参数
      cloneDom.style.padding = "16px";
      cloneDom.style.position = "absolute";
      cloneDom.style.top = "0px";
      cloneDom.style.zIndex = "-1";
      cloneDom.style.width = width;
      document.body.appendChild(cloneDom);
      html2canvas(cloneDom).then(canvas => {
        // 转成图片,生成图片地址
        var imgUrl = canvas.toDataURL("image/png");
        var eleLink = document.createElement("a");
        eleLink.href = imgUrl; // 转换后的图片地址
        eleLink.download = "pictureName";
        // 触发点击
        document.body.appendChild(eleLink);
        eleLink.click();
        // 然后移除
        document.body.removeChild(eleLink);
      });
      cloneDom.style.display = "none";
    }
  }
};
</script> 

3、截图并上传

安装axios

npm install --save axios

实现步骤:

1、点击按钮,通过html2canvas 将id为head-image 的元素截取为canvas

2、通过canvas 得到dataURL

3、将dataURL 转换为Blob二进制流

4、通过axios上传文件

<template>
  <div>
    <h4 style="color: red;" id="head-image">Hello world!</h4>
    <button @click="saveImage">screenshots</button>
  </div>
</template>
<script>
import html2canvas from "html2canvas";
import axios from "axios";
export default {
  methods: {
    async saveImage() {
      const res = await this.html2canvasAndUploadFile("#head-image");
      console.log(res);
    },
    // 传入元素id,获取服务器返回的结果
    async html2canvasAndUploadFile(selector) {
      const canvas = await html2canvas(document.querySelector(selector));
      // 将canvas转成base64
      let dataURL = canvas.toDataURL("image/png");
      // 打印的是图片的base64编码
      let blob = this.dataUrlToBlob(dataURL);
      return await this.uploadFile(blob);
    },
    // 将base64转成图片文件流
    dataUrlToBlob(dataUrl) {
      let arr = dataUrl.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        // arr[0]是data:image/png;base64
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      let imgFile = new Blob([u8arr], {
        type: mime
      });
      return imgFile;
    },
    // 上传二进制文件
    async uploadFile(blob) {
      const formData = new FormData();
      formData.append("image", blob);
      const res = await axios({
        method: "post",
        url: "/uploadurl",
        data: formData,
        headers: {
          "Content-Type": "multipart/form-data"
        }
      });
      return res.data;
    }
  }
};
</script> 

参考

  1. 使用 axios 上传媒体文件
  2. html页面转成图片,并传给后台二进制文件流
相关文章
|
11月前
超好看的404提示页面HTML源码
超好看的404提示页面HTML源码
599 77
|
8月前
简约404错误页面HTML源码
简约404错误页面HTML源码
347 12
|
11月前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
526 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
10月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
299 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
11月前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
343 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
11月前
css3 svg制作404页面动画效果HTML源码
css3 svg制作404页面动画效果HTML源码
242 34
|
前端开发 测试技术 定位技术
如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤
本文深入介绍了如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤。通过实例展示了主页、关于我们、产品展示、新闻动态及联系我们等页面的设计与实现,强调了合理布局、美观设计及用户体验的重要性。旨在为企业打造一个既专业又具吸引力的线上平台。
496 7
太便利了 !通义灵码方便生成html页面
太便利了 !通义灵码方便生成html页面
362 0
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
189 0
|
3月前
|
JavaScript
Vue中Axios网络请求封装-企业最常用封装模式
本教程介绍如何安装并配置 Axios 实例,包含请求与响应拦截器,实现自动携带 Token、错误提示及登录状态管理,适用于 Vue 项目。
141 1