今天想做一个 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. 不允许还有Java程序员不了解BlockingQueue阻塞队列的实现原理

    我们平时开发中好像很少使用到BlockingQueue(阻塞队列),比如我们想要存储一组数据的时候会使用ArrayList,想要存储键值对数据会使用HashMap,在什么场景下需要用到Blocking ...

  2. 删除数组里含有a的元素,并且将null值放在后面

    想去掉里面含有a的元素,并将null放在后面.放在后面就是往后移,其他值往左移 1 public static void main(String[] args) { 2 //自定义的一个数组 3 St ...

  3. JSP中request对象的简单实用,实现简单的注册以及个人信息的展示

    JSP中Request对象的使用 概述:request对象主要用于接收客户端发送来的请求信息,客户端的请求信息被封装在request对象中,通过它可以了解到客户的需求,然后做出响应.主要封装了用户提交 ...

  4. JS中的键盘Keycode

    常用的keycode 组合键 if ((window.event.ctrlKey)&&(window.event.keyCode==49)) alert("您按下了CTRL+ ...

  5. idea如何生成jar包

    最近在研究RMI反序列化命令执行的漏洞,让我这个java新手吃尽了苦头,能多学习一些是一些吧. 记录一下写好的java文件生成jar包的过程. 环境: Win10,jdk1.7, idea2016.2 ...

  6. Rock18框架之整体框架介绍

    1. 总体框架图 2.框架能解决哪些问题? 问题1: 自动化设备包含龙门架.机械手.伺服.步进等电机.IO控制.定位及纠偏.界面展示等部分.其中硬件(伺服.IO等)是需要更换的,硬件的更换不影响整套系 ...

  7. adb 安装与使用

    什么是adb adb 是有个通用命令行工具 他允许您与模拟器实例或者链接的Android设备进行通信,他可为各种设备操作提供便利,比如安装和调试应用 启动adb 服务在命令行中输入adb start- ...

  8. 【题解】[ARC113C] String Invasion

    题面传送门 解决思路 题目大意是给你一个字符串 \(s\) ,定义一次操作为对于长度为 \(3\) 的一个子段,满足 \(s_i=s_{i+1}\ne s_{i+2}\),则可以将 \(s_{i+2} ...

  9. React+echarts (echarts-for-react) 画中国地图及省份切换

    有足够的地图数据,可以点击到街道,示例我只出到市级 以umi为框架,版本是: "react": "^18.2.0", "umi": &quo ...

  10. 你听说过OTA吗?

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/M660Sc4ey1SxCpRT6vcM9g what? 不知有多少 ...