利用JavaScript从剪贴板获取图片并上传服务器

article/2025/9/24 13:07:49

1、参考:

  • 使用 JavaScript File API 实现文件上传
  • FileReader.readAsDataURL()
  • 基于Servlet3的文件上传中的示例2:基于JQuery的单文件上传

2、onpaste 剪贴板事件

onpaste 事件在用户向元素中粘贴文本时触发。有三种方式可以在元素中粘贴内容:

  • 按下 CTRL + V
  • 从浏览器的编辑菜单中选择 Paste(粘贴)菜单项
  • 右击鼠标按钮在上下文菜单中选择 “Paste(粘贴)” 菜单项

粘贴事件提供了一个clipboardData的属性,如果该属性有items属性,那么就可以查看items中是否有图片类型的数据了。

3、clipboardData介绍

clipboardData实际上是一个DataTransfer类型的对象(DataTransfer是拖动产生的一个对象)。clipboardData的属性介绍:

属性类型说明
dropEffectString默认是 none
effectAllowedString默认是 uninitialized
filesFileList粘贴操作为空List
itemsDataTransferItemList剪切板中的各项数据
typesArray剪切板中的数据类型

说明:

  • files
    文件(例如剪切板中的数据)
  • items:items是一个DataTransferItemList对象,里面都是DataTransferItem类型的数据。
    • items的DataTransferItem有以下两个属性:
属性说明
kind一般为string或者file
type具体的数据类型,例如:哪种类型字符串或者哪种类型的文件,即MIME-Type
  • items的方法
方法参数说明
getAsFile如果kind是file,可以用该方法获取到文件
getAsString回调函数如果kind是string,可以用该方法获取到字符串,字符串需要用回调函数得到,回调函数的第一个参数就是剪切板中的字符串
  • types:一般types中常见的值有:
说明
text/plain普通字符串
text/html带有样式的html

4、FileReader对象

FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。其中,File对象可以是:

  • 来自用户在一个元素上选择文件后返回的FileList对象
  • 来自拖放操作生成的 DataTransfer对象
  • 来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果

FileReader对象的事件处理:

  • FileReader.onload处理load事件,该事件在读取操作完成时触发。
  • FileReader.onloadend处理loadend事件,该事件在读取操作结束时(要么成功,要么失败)触发。

FileReader对象的readAsDataURL()方法:

  • FileReader.readAsDataURL()开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容。
  • readAsDataURL: 该方法会读取指定的 Blob 或 File 对象。读取操作完成的时候,readyState 会变成已完成(DONE),并触发 loadend 事件,同时 result 属性将包含一个data:URL格式的字符串(base64编码)以表示所读取文件的内容。

5、示例:模拟实现CSDN Markdown编辑器复制图片上传的功能

5.1、环境:Tomcat9、JDK8

5.2、前端页面

```html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en"><head><meta charset="UTF-8"><title>利用JavaScript从剪贴板获取图片并发送</title><script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script><script type="text/javascript">$(function () {document.getElementById("blog").addEventListener('paste', function (e) {var items;if (e.clipboardData && e.clipboardData.items) {items = e.clipboardData.items;if (items) {items = Array.prototype.filter.call(items, function (element) {return element.type.indexOf("image") >= 0;});Array.prototype.forEach.call(items, function (item) {var blob = item.getAsFile();var reader = new FileReader();reader.onloadend = function (event) {var imgBase64 = event.target.result;console.log(imgBase64);  // base64var dataURI = imgBase64;var blob = dataURItoBlob(dataURI); // blobconsole.log(blob);uploadImg(blob);};reader.readAsDataURL(blob);});}}});});// base64  to blob二进制function dataURItoBlob(dataURI) {var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // mime类型var byteString = atob(dataURI.split(',')[1]); //base64 解码var arrayBuffer = new ArrayBuffer(byteString.length); //创建缓冲数组var intArray = new Uint8Array(arrayBuffer); //创建视图for (var i = 0; i < byteString.length; i++) {intArray[i] = byteString.charCodeAt(i);}return new Blob([intArray], {type: mimeString});}//上传图片function uploadImg(file) {var formData = new FormData();formData.append('imageFile', file);formData.append('info', 'haha');  // 添加自定义数据$.ajax({data:formData,method:'POST',// 告诉jQuery不要去处理发送的数据processData: false,contentType: false,url:'${pageContext.request.contextPath}/clipboardImgUpload',success:function (data) {var data = JSON.parse(data);var tarBox = document.getElementById('box');if (data.code == 1) {document.getElementById("blog").value = data.src;var img = document.createElement('img');img.src = data.src;tarBox.appendChild(img);} else {alert(data.msg);}},error:function (data) {console.log(data);}})}</script></head><body style="padding: 0 7% 0 7%;"><textarea style="width: 49%;height: 600px;" id="blog"></textarea><span id="box" style="border:1px solid darkblue; float: right;width: 50%;height: 600px;"></span></body>
</html>
```

5.3、后台代码

```java
@MultipartConfig    //标识Servlet支持文件上传
@WebServlet(urlPatterns = "/clipboardImgUpload")
public class ClipboardImgUploadServlet extends HttpServlet {@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");String savePath = request.getServletContext().getRealPath("\\uploadFile");  //存储路径File path = new File(savePath);if (!path.exists()) {path.mkdirs();}PrintWriter out = response.getWriter();String res = "";try {System.out.println(request.getParameter("info"));Part part = request.getPart("imageFile"); //通过表单file控件(<input type="file" name="file">)的名字直接获取Part对象String fileName = UUID.randomUUID().toString() + ".png";part.write(savePath + File.separator + fileName);           //把文件写到指定路径res = "{\"code\":1,\"msg\":\"图片上传成功\",\"src\":\"uploadFile/" + fileName + "\"}";} catch (IOException | ServletException e) {e.printStackTrace();res = "{\"code\":0,\"msg\":\"图片上传失败\",\"src\":\"\"}";} finally {System.out.println(res);out.println(res);out.flush();out.close();}}}
```
  • 运行程序:
    默认页面
    在这里插入图片描述
    复制一张图片,直接在左边的textarea中按快捷键ctrl+v,效果如下图
    在这里插入图片描述

http://chatgpt.dhexx.cn/article/GMgXclIi.shtml

相关文章

Internet协议的安全性

网际层 安全问题 1.IP数据报在传递过程中被窃取 措施&#xff1a;读ip数据报进行加密 2.数据净荷可能被截取后修改 措施&#xff1a;对ip数据净荷进行完整性检测 3. 攻击者发送伪造源地址数据包欺骗接收者&#xff0c;也称为ip欺骗 措施&#xff1a;对数据包的源地址鉴别 4. A…

winget InternetOpenUrl() failed. 0x80072f7d

今天使用 winget 安装东西的时候提示&#xff1a; 尝试更新源时失败&#xff1a; winget 执行此命令时发生意外错误&#xff1a; InternetOpenUrl() failed. 0x80072f7d : unknown error对于我而言是因为其他原因关闭了 tls 1.2&#xff0c;在控制面板->网络和 Internet-&g…

Internet网际协议 --- IP地址

IP地址 一.IP地址简介二.分类IP地址三.IP子网划分与子网掩码四.无类域间路由CIDR五.路由聚合六.IP包转发 一.IP地址简介 1.IP地址&#xff0c;网络上的每一台主机&#xff08;或路由器&#xff09;的每一个接口都会分配一个全球唯一的32位的标识符。 2.将IP地址划分为固定的类…

HTTP-web-Internet

互联网&#xff08;Internet&#xff09; 互联网&#xff1a;将全球计算机互联在一起的网络。目前最流行的实现协议是TCP/IP。 万维网&#xff08;WWW&#xff09; 万维网&#xff1a;基于HTTP协议实现全球性、动态交互、跨平台的分布式图形信息系统。是互联网上应用最为广泛的…

internet协议

1&#xff1a;引言 IP时TCP/IP中的核心协议IP提供了一种尽力而为&#xff0c;无连接的数据报交付服务 2&#xff1a;IP头部 正常的IPV4头部大小为20字节。除非存在选项&#xff08;少见&#xff09;IPV6的长度是40字节&#xff0c;没有选项字段&#xff0c;IPV6有扩展头部 …

Internet网际协议---IPv4协议

IPv4协议 一.IPv4协议简介二.IPv4数据报格式&#xff08;由首部和数据组成&#xff09;三.数据报分片与重组四.IP协议功能及报头字段总结 一.IPv4协议简介 1.IPv4协议&#xff1a;网际协议版本4&#xff0c;一种无连接的协议&#xff0c;是互联网的核心&#xff0c;也是使用最…

网络Internet

前言 加油 原文 网络常用会话 ❶ This online store discounted all computers for sale. 该网店削价出售全部待售的电脑。 ❷ The latest laptop is very portable. 最新的这款笔记本很便携。 ❸ Add up the figures in this column. 把这一栏的数字合计一下。 ❹ Consu…

Internet协议——IP

IP Internet协议——IPIP协议与tcp/IP的关系IP地址的表示IP地址的特点地址转换——ARP反向地址转换——RARP计算子网掩码 IP数据报的格式IP数据报首部的固定部分 Internet协议——IP IP&#xff1a;通信子网的最高层。提供无连接的数据报传输机制。IP协议是点到点&#xff0c;…

InternetOpen InternetOpenUrl InternetReadFile 和 InternetCloseHandle

文章目录 InternetOpen函数功能函数声明第一个参数第二个参数第三个参数第四个参数第五个参数返回值补充&#xff1a;InternetOpenUrl函数功能函数声明第一个参数第二个参数第三个参数第四个参数第五个参数第六个参数返回值补充补充InternetReadFile函数功能函数声明第一个参数…

juniper设备日常操作指南

1、日常show操作 # show 查看所有配置 # show | display set 查看set格式的所有配置 # show system | display set 查看set格式的system层级配置 # show system login | display set 查看set格式的system层级下的login层级配置# run show version # run show route 1.1.1.…

这几个juniper巡检命令超实用

1. CPU利用率核查 show chassis routing-engine2. MEM利用率核查 show chassis routing-engine3. OSPF邻居关系核查 show ospf neighbor4. LDP端口状态检查 show ldp interface5. ISIS邻居关系检查 show isis adjacency6. BGP邻居关系检查 show bgp neighbor7. HSRP信息检…

Juniper

Juniper Networks[编辑] Juniper Networks公司类型 上市&#xff08;NYSE&#xff1a;JNPR&#xff09;成立1996年2月代表人物执行长&#xff1a;Shaygan Kheradpir 技术长&#xff1a;Pradeep Sindhu 董事长&#xff1a;Scott Kriens总部地点 加州森尼韦尔&#xff08;Sunnyva…

Juniper入门之RIP

拓扑 配置 JUNOS-1 #配置接口 interfaces {em2 {unit 10 {family inet { address 12.1.1.1/24;}}}lo0 {unit 10 {family inet {address 1.1.1.1/32;}}} } protocols {rip {import import-policy;group rip-group {export export-policy;neighbor em2.10 {send …

Juniper Radius And Tacacs Server 认证测试

1. 简述 Juniper产品支持Radius、Tacacs及本地Password认证。根据不同的用户需求&#xff0c;3A服务器认证可能会结合域用户、LDAP、RSA-Token等认证服务器进行综合认证。此测试报告使用Juniper VSRX和Cisco ACS5.2验证3A相关认证选项。 2. 测试拓扑 使用Vmware workstation 9…

Juniper-SRX-基于域控认证的用户防火墙

目录 1&#xff1a;架构与环境说明 2&#xff1a;防火墙基础配置 3&#xff1a;Win-server部署 4&#xff1a;SRX-加域流量放行 5&#xff1a;Client相关域设置 6&#xff1a;Win-server联动SRX的相关设置 7&#xff1a;SRX-外部Server配置 8&#xff1a;SRX域控认证策略…

Juniper考试认证简单介绍

简单的对考试的介绍&说明&#xff1a; JUNIPER认证考试是分产品的&#xff0c;目前最完善的是M/T骨干路由器产品的考试&#xff1b; JNCIS&#xff0c;这个是笔试&#xff1b; JNCIP&#xff0c;实验室考试[1天]&#xff1b; JNCIE&#xff0c;实验室考试[1天]&#xff1b;…

Juniper认证介绍

转自&#xff1a;http://tech.ddvip.com/2008-06/121260544745173.html Juniper网络公司技术认证项目(JNTCP)由特定平台的多级系列课程组成。每套课程都允许学员通过笔试、实际配置及故障排除考试相结合的方式来证明自己在Juniper网络公司技术方面的能力。通过考试的考生可以证…

Juniper防火墙之图解用户认证

今天正好学习到Juniper防火墙中的用户认证&#xff0c;那么今天就带大家来看看Juniper防火墙的用户认证。 Juniper防火墙的用户分类&#xff1a; 1、Admin User&#xff1a;管理员用户 2、Auth User&#xff1a;认证用户 3、IKE User&#xff1a;IKE第一阶段用户的认证 4、XAut…

设计模式-观察者模式

观察者模式定义 观察者模式定义对象之间的一对多以来&#xff0c;这样以来&#xff0c;当一个对象改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新。 观察者模式理解 结合下面的观察者模式类图。 首先&#xff0c;我们要知道观察者就是那群等待被通知的人&…

vue -观察者模式

观察者模式 vue中的观察者模式什么是观察者模式案例 vue中的观察者模式 vue2 底成的原理是 object.defineproperty&#xff08;&#xff09; 配合观察者模式 object.defineproperty&#xff08;&#xff09;对数据可以进行劫持 当数据发生变化的时候 需要通知被依赖的地方 这时…