今天想做一个 Js + Jq 截取网页图并上传到后端,经过一番折腾最终达到了效果。

1·首先需要用到一个非常强大的外部依赖库 html2canvas

html2canvas 官网:html2canvas - Screenshots with JavaScript (hertzen.com)

去官网复制 Js 依赖代码 ( html2canvas.js 或 html2canvas.min.js )

新建一个js文件,把复制的代码放进去,哪个页面要用就导入这个 js(也可引用点进去后的url )

导入 js 后官网给的示例只需要两份代码(HTML + Js)

<div id="capture" style="padding: 10px; background: #f5da55">
<h4 style="color: #000; ">Hello world!</h4>
</div>
html2canvas(document.querySelector("#capture")).then(canvas => {
document.body.appendChild(canvas);
});

代码放入后会有两个 Hello world! 下面那个就是图片,右键可下载

2·Base64 转 blob 函数

function base64ToBlob(base64, mime) {
mime = mime || '';
var sliceSize = 1024;
var byteChars = window.atob(base64);
var byteArrays = []; for (var offset = 0, len = byteChars.length; offset < len; offset += sliceSize) {
var slice = byteChars.slice(offset, offset + sliceSize); var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
} return new Blob(byteArrays, {type: mime});
}

3·获取生成的图片(调用此函数可获取图片并上传)

function getCanvas() {
// 获得Canvas对象
let canvas = document.getElementsByTagName("canvas")[0];
let ctx = canvas.getContext('2d');
ctx.drawImage(canvas, 0, 500, 500, 500); // 参考 drawImage() 函数用法
let dataURL = canvas.toDataURL("image/png"); // 将canvas转换成base64
dataURL = dataURL.substring(dataURL.indexOf(',') + 1, dataURL.length);
// console.log(dataURL); var blob = base64ToBlob(dataURL, 'image/png'); // 将base64转换成blob
var imgData = new FormData();
imgData.append('file', blob);   // 上传
$.ajax({
url: 'http://127.0.0.1:8080/testData',
type: "POST",
dataType: 'json',
contentType: false, //必须加
processData: false, //必须加
cache: false,
contentType: false,
data: imgData,
}).done(function(e) {
alert('done!');
});
}

4·SpringBoot接收

@CrossOrigin // 跨域
@PostMapping("/testData")
public void testData(@RequestParam("file") MultipartFile imgData) throws IOException {
if (imgData != null) {
// 文件夹目录
String folderPath = "C:\\Users\\cool\\Desktop\\"; File fileDir = new File(folderPath);
if(!fileDir.exists()) {
fileDir.mkdirs();
} // 获取图片名称(因上传的是blob,后缀需自定义)
String savePath = folderPath + imgData.getOriginalFilename() + ".png"; // 保存到本地
imgData.transferTo(new File(savePath));
}
}

获取+上传 事件,调用  getCanvas() 

上文有的 Js 可以用 Jq 替代,这里就不作修改了。

到此一个简单的 网页截图 + 上传 功能就做好了,后期功能可以在此基础上拓展。

实现过程参考文章:

html2canvas - Screenshots with JavaScript (hertzen.com)

摄像头canvas对象转换成base64_想当程序员$的博客-CSDN博客

base64转文件(blob)遇到的一个问题 - 简书 (jianshu.com)

使用Ajax上传base64图像-前端-CSDN问答

实现图片文件上传保存到本地 MultipartFile_坐的我尾巴骨疼的博客-CSDN博客_multipartfile保存到本地

Js/Jq 截图并上传的更多相关文章

  1. 图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传

    一 . 背景及效果 当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入. 图片 ...

  2. js实现图片粘贴上传到服务器并展示

    最近看了一些有关于js实现图片粘贴上传的demo,实现如下: (这里只能检测到截图粘贴和图片右键复制之后粘贴) demo1: document.addEventListener('paste', fu ...

  3. js插件---IUpload文件上传插件(包括图片)

    js插件---IUpload文件上传插件(包括图片) 一.总结 一句话总结:上传插件找到真正上传位置的代码,这样就可以知道整个上传插件的逻辑了, 找资料还是github+官方 1.如何在js中找到真正 ...

  4. 使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

    使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器 ajax上传主要使用了 var reader = new FileReader() 此方法 js图片压缩主要是利用canvas进 ...

  5. JavaScript进阶(九)JS实现本地文件上传至阿里云服务器

    JS实现本地文件上传至阿里云服务器 前言 在前面的博客< JavaScript进阶(八)JS实现图片预览并导入服务器功能>(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务 ...

  6. js基础进阶--图片上传时实现本地预览功能的原理

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 最近在项目上加一个图片裁剪上传的功能,用的是cropper插件,注意到选择本地图片后就会有预览效果,这里整理一下这种预览效 ...

  7. PHP 多图上传,图片批量上传插件,webuploader.js,百度文件上传插件

    PHP  多图上传,图片批量上传插件,webuploader.js,百度文件上传插件(案例教程) WebUploader作用:http://fex.baidu.com/webuploader/gett ...

  8. 基于uploadify.js实现多文件上传和上传进度条的显示

    uploadify是JQuery的一个插件,主要实现文件的异步上传功能,可以自定义文件大小限制.文件类型.是否自动上传等属性,可以显示上传的进度条.官网地址是http://www.uploadify. ...

  9. js实现oss文件上传及一些问题

    关于兼容性问题,ie8以下的可以使用4.x的版本 一.引入sdk和jq <script src="http://libs.baidu.com/jquery/2.0.0/jquery.m ...

  10. 在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 <!-- 把需要生成截图的元素放在一个元素容器里,设置一个ref --> <di ...

随机推荐

  1. Spring使用注解开发及使用java类进行配置bean

    Spring使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0& ...

  2. C++ 函数重载解析策略

    参考<C++ Primer Plus>(第6版)中文版,Stephen Prata 著,张海龙 袁国忠译,人民邮电出版社.C++ 使用重载解析策略来决定为函数调用使用哪一个函数定义.重载解 ...

  3. 3.Task对象

    Task对象 用于调度或并发协程对象 在事件循环中可以添加多个任务   创建task对象三种方式 创建task对象可以让协程加入事件循环中等待被调度执行 3.7版本之后加入asyncio.create ...

  4. SpringBoot 常用注解的原理和使用

    @AutoConfiguration 读取所有jar包下的 /META-INF/spring.factories 并追加到一个 LinkedMultiValueMap 中.每一个url中记录的文件路径 ...

  5. yum 更新yum源

    yum 更新yum源 # 1.做好备份,防止更新失败时切换回去 $ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base. ...

  6. 使用@Transactional注解的方法所在的类获取不到注解的解决方案

    前段时间遇到一个问题,一个service叫做A吧,有多个实现类分别是B,C,D,需要根据前端传的不同参数去匹配不同的实现类,我就自定义了一个注解@OrderDeal放在B,C,D上面,然后匹配前端传的 ...

  7. YC-Framework版本更新:V1.0.10

    分布式微服务框架:YC-Framework版本更新V1.0.10!!! 本文主要内容: 1.V1.0.10版本更新主要内容2.YC-Framework相关系列文章分享 一.V1.0.10版本更新主要内 ...

  8. November 练习(Tou Xue)打卡

    Flag:NOIP前偷100道 \(\text{CF }1600\sim 2000+\) \(\text{or}\) \(\text{At } 1200\sim 1800+\) \(\text{or} ...

  9. Ian Lance Taylor

    https://img.mukewang.com/5a9dfda50001933e23006728.png 在GCC的世界中,没有人比Ian更火.在GCC maillist中,Ian的身影呈现在前端中 ...

  10. C++ undered_map哈希表用法——leetcode两数之和

    undered_map 头文件:#include<undered_map> 创建表undered_map<key,value> Map_name; 插入元素 a[key]=va ...