html2canvas+jQuery+SpringMVC 实现网页转图片并保存到服务器

简介: 前端使用的是 RequireJS + jQuery 后端使用的是 SpringMVC + MyBatis 涉及资料 html2canvas 官网 将转换后的图片存储服务器的参考 将网页转换为图片 下载插件包 html2canvas 目前最新版是 v-1.

前端使用的是 RequireJS + jQuery
后端使用的是 SpringMVC + MyBatis

更多精彩

涉及资料

  1. html2canvas 官网
  2. 将转换后的图片存储服务器的参考

将网页转换为图片

下载插件包

  1. html2canvas 目前最新版是 v-1.0.0-aplha.12 ,该版本使用的是 ES6 语法
  2. 但本项目使用的是 jQuery ,并且基于 ES5 的语法,所以引入最新版插件时会一直报错 Uncaught (in promise)
  3. 对于没有使用的 ES6 语法的项目,建议下载 2017 年的版本,本文使用的是 v-0.5.0-beta4

调用插件进行转换

  1. 最新版及官网介绍的方法是基于 ES6 的语法结构,对于使用 ES5 语法的项目,需要使用如下方法
  2. 方法第一个参数是传入 DOM 元素,而通过 jQuery 获取的 DOM 元素实际上是一个集合,所以需要通过下标指定具体元素后插件才能正常获取
  3. 方法第二个参数是传入 options 配置,对于 ES5 语法需要使用 onrendered: function(canvas) {...} 来执行回调
html2canvas($diplomaInfoPanel[0], {
  useCORS: true,
  onrendered: function (canvas) {
    // 执行回调
  }
})
AI 代码解读

在转换时需要解决图片跨域问题

  1. 众所周知 canvas 无法处理跨域图片,那么基于 canvas 实现的 html2canvas 自然也无法处理跨域图片
  2. 如果在插件待转换的 DOM 结构中存在跨域图片,则会转换失败并报错
  3. 虽然插件本身提供了一些处理跨域的方式,但本文是通过 后端代理转发图片 的操作来规避跨域问题的,如下
// 在图片地址直接发起图片请求
<img src="${ctx}/api/diploma/info/${memberDiploma.diploma.hexId}/thumbnail" alt="">
AI 代码解读
// 控制层接收请求
@RequestMapping("/{diplomaId}/thumbnail")
public void thumbnail(HttpServletResponse response, @PathVariable String diplomaId) {
    diplomaInfoService.getThumbnail(response, diplomaId);
}
AI 代码解读
// 逻辑层获取到真实图片后通过流的形式反馈到前端
public void getThumbnail(HttpServletResponse response, String diplomaId) {
    try {
          // 提供图片完整地址并转换
        BufferedImage read = ImageIO.read(new URL(CommonHelper.buildDiplomaThumbnail(diplomaId)));
        OutputStream outputStream = response.getOutputStream();

        ImageIO.write(read, "png", outputStream);

        read.flush();
        outputStream.flush();
        outputStream.close();
    } catch (IOException e) {
        logger.error("证书图片代理获取失败", e);
    }
}
AI 代码解读

将图片保存至服务器

前端将图片转换为 BASE64 格式供服务器接收

  1. 想要将图片传至后端,需要使用 canvas 的 canvas.toDataURL('image/jpeg') 将画布转换为 BASE64 格式的图片
  2. BASE64 格式的图片链接对于后端来说就是一个字符串,所以可以直接接收
onrendered: function (canvas) {
  // 画布转图片链接
  var image = canvas.toDataURL('image/jpeg')

  // 自行封装的 ajax 方法
  $.ts.doAction('/api/diploma/info/save', {
    memberDiplomaId: currentMemberDiplomaId,
    image: image
  }, function () {
      // 异步回调
  }, '', '', '')
}
AI 代码解读

接收 BASE64 并重新转换为图片格式

  1. 接收前端传入的 BASE64 字符串后,需要通过 org.apache.commons.codec.binary.Base64 将其转换为 byte[] 格式

    • 需要注意的是字符串中 data:image/jpeg;base64, 之后的内容才是有效内容,所以需要在转换时先截取掉这一部分
  2. 转换后直接使用 org.apache.commons.io.FileUtils 保存图片到指定路径即可
private static final String BASE64_PREFIX = "data:image/jpeg;base64,";

public void saveMemberDiplomaImage(String memberDiplomaId, String image) {
    Base64 base64 = new Base64();
    byte[] bytes = base64.decode(image.substring(BASE64_PREFIX.length()));

    String filePath = SOPConstants.UPLOAD_FILE_ROOT_PATH + Constants.DIPLOMA_MEMBER_FILE_PATH + super.getMember().getHexId() + "/";
    String fileName = Constants.THUMB_FILE_PREFIX + memberDiplomaId + Constants.THUMB_FILE_EXTENSION;

    FileUtils.writeByteArrayToFile(new File(filePath + fileName), bytes);
}
AI 代码解读
目录
打赏
0
0
0
0
5
分享
相关文章
|
3月前
|
jquery实现的网页版扫雷小游戏源码
这是一款基于jQuery实现的经典扫雷小游戏源码,玩家根据游戏规则进行游戏,末尾再在确定的地雷位置单击右键安插上小红旗即可赢得游戏!是一款非常经典的jQuery游戏代码。本源码改进了获胜之后的读数暂停功能。
138 69
|
3月前
|
jQuery+HTML5实现的微信大转盘抽奖源码
这是一款基于jQuery+HTML5实现的微信大转盘抽奖效果源码,是一款可配置奖品抽奖的jQuery大转盘抽奖代码,可实现点击按钮转轮旋转实现抽奖功能,效果逼真自然,代码里面有详细的注释,可以修改文字或者二次开发都可以
68 11
|
3月前
|
jQuery实现的卡片式翻转时钟HTML源码
jQuery实现的卡片式翻转时钟HTML源码
29 0
jQuery实现的卡片式翻转时钟HTML源码
jquery中html()方法的使用
jquery中html()方法的使用
93 1
HTML5 服务器发送事件(Server-Sent Events)详解
**服务器发送事件(Server-Sent Events, SSE)** 是一种用于构建单向实时通信的技术,允许服务器主动向客户端(通常是浏览器)推送更新。SSE 提供了一个简单的 API,非常适合实时应用,如新闻更新、天气变化、社交媒体通知等。SSE 基于 HTTP 协议,通过长连接实现数据传输。其主要优点包括简洁的 API、持久连接和自动重连功能。大多数现代浏览器都内置了对 SSE 的支持。通过简单的服务器端和客户端代码,可以轻松实现数据的实时推送和接收。
jQuery HTML / CSS 方法
jQuery HTML / CSS 方法
43 2
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
springmvc前端jsp与html
在Spring MVC框架中,前端页面既可以使用JSP(JavaServer Pages)也可以使用HTML,具体使用哪一种或哪几种技术,主要取决于项目的需求、团队的熟悉度以及项目的可维护性等因素。
76 2
jQuery HTML / CSS 方法
jQuery HTML / CSS 方法
44 0
JSF遇上DevOps:开发流程将迎巨变?一篇文章带你领略高效协同的魅力!
【8月更文挑战第31天】本文探讨了如何在JavaServer Faces(JSF)开发中融入DevOps文化,通过持续集成与部署、自动化测试、监控与日志记录及反馈机制,提升软件交付速度与质量。文中详细介绍了使用Jenkins进行自动化部署、JUnit与Selenium进行自动化测试、ELK Stack进行日志监控的具体方法,并强调了持续改进的重要性。
67 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等