html2canvas+jQuery+SpringMVC 实现网页转图片并保存到服务器
前端使用的是 RequireJS + jQuery
后端使用的是 SpringMVC + MyBatis
更多精彩
- 更多技术博客,请移步 asing1elife's blog
涉及资料
将网页转换为图片
下载插件包
- html2canvas 目前最新版是 v-1.0.0-aplha.12 ,该版本使用的是 ES6 语法
- 但本项目使用的是 jQuery ,并且基于 ES5 的语法,所以引入最新版插件时会一直报错
Uncaught (in promise)
- 对于没有使用的 ES6 语法的项目,建议下载 2017 年的版本,本文使用的是 v-0.5.0-beta4
调用插件进行转换
- 最新版及官网介绍的方法是基于 ES6 的语法结构,对于使用 ES5 语法的项目,需要使用如下方法
- 方法第一个参数是传入 DOM 元素,而通过 jQuery 获取的 DOM 元素实际上是一个集合,所以需要通过下标指定具体元素后插件才能正常获取
- 方法第二个参数是传入 options 配置,对于 ES5 语法需要使用
onrendered: function(canvas) {...}
来执行回调
html2canvas($diplomaInfoPanel[0], {
useCORS: true,
onrendered: function (canvas) {
// 执行回调
}
})
在转换时需要解决图片跨域问题
- 众所周知 canvas 无法处理跨域图片,那么基于 canvas 实现的 html2canvas 自然也无法处理跨域图片
- 如果在插件待转换的 DOM 结构中存在跨域图片,则会转换失败并报错
- 虽然插件本身提供了一些处理跨域的方式,但本文是通过 后端代理转发图片 的操作来规避跨域问题的,如下
// 在图片地址直接发起图片请求
<img src="${ctx}/api/diploma/info/${memberDiploma.diploma.hexId}/thumbnail" alt="">
// 控制层接收请求
@RequestMapping("/{diplomaId}/thumbnail")
public void thumbnail(HttpServletResponse response, @PathVariable String diplomaId) {
diplomaInfoService.getThumbnail(response, diplomaId);
}
// 逻辑层获取到真实图片后通过流的形式反馈到前端
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);
}
}
将图片保存至服务器
前端将图片转换为 BASE64 格式供服务器接收
- 想要将图片传至后端,需要使用 canvas 的
canvas.toDataURL('image/jpeg')
将画布转换为 BASE64 格式的图片 - BASE64 格式的图片链接对于后端来说就是一个字符串,所以可以直接接收
onrendered: function (canvas) {
// 画布转图片链接
var image = canvas.toDataURL('image/jpeg')
// 自行封装的 ajax 方法
$.ts.doAction('/api/diploma/info/save', {
memberDiplomaId: currentMemberDiplomaId,
image: image
}, function () {
// 异步回调
}, '', '', '')
}
接收 BASE64 并重新转换为图片格式
-
接收前端传入的 BASE64 字符串后,需要通过
org.apache.commons.codec.binary.Base64
将其转换为byte[]
格式- 需要注意的是字符串中
data:image/jpeg;base64,
之后的内容才是有效内容,所以需要在转换时先截取掉这一部分
- 需要注意的是字符串中
- 转换后直接使用
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);
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
TensorFlow tf.app&tf.app.flags用法介绍
TensorFlow tf.app&tf.app.flags用法介绍 TensorFlow tf.app argparse tf.app.flags 下面介绍 tf.app.flags.FLAGS的使用,主要是在用命令行执行程序时,需要传些参数,其实也就可以理解成对argparse库进行的封装,示例代码如下 #coding:utf-8 # 学习使用 tf.app.flags 使用,全局变量 # 可以再命令行中运行也是比较方便,如果只写 python app_flags.py 则代码运行时默认程序里面设置的默认设置 # 若 python app_flags.py --train_data_path <绝对路径 train.txt> --max_sentence_len 100 # --embedding_size 100 --learning_rate 0.05 代码再执行的时候将会按照上面的参数来运行程序 import tensorflow as tf FLAGS = tf.app.flags.FLAGS # tf.app.flags.DEFINE_stri...
-
下一篇
TensorFlow 初级
代码详见:NoteBook 我的博客:TensorFlow 核心——数据流图 TensorFlow 是基于数据流图 (Data Flow Graph), 支持自动微分 (简称AD) 的数值计算库。本文仅仅考虑低级 API. TensorFlow 的计算图模型一般分为两个步骤:创建计算图,在 Session 中运行。(暂不考虑 Eager) 为了更好的管理模型,最好在特定的 Graph 中创建模型,且对于实现不同功能的模块最好按照 name_scope 对其进行划分。下面是一个 Demo: # Explicitly create a Graph object graph = tf.Graph() with graph.as_default(): with tf.name_scope("variables"): # Variable to keep track of how many times the graph has been run global_step = tf.Variable(0, dtype=tf.int32, name="global_step") # Variable...
相关文章
文章评论
共有0条评论来说两句吧...