Js实现粘贴上传图片的原理及示例


Posted in Javascript onDecember 09, 2020

我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢?

原理分析:
复制=>粘贴=>上传

在这个操作过程中,我们需要做的就是:监听粘贴事件=>获取剪贴板里的内容=>发请求上传

需要明白的是:

我们只能上传截图工具截的图片(qq截图、微信截图等),不能粘贴上传系统里的图片(从桌面上、硬盘里复制),因为他们是存在完全不同的地方。

知悉paste event这个事件:当进行粘贴(右键paste/ctrl+v)操作时,该动作将触发名为'paste'的剪贴板事件,这个事件的触发是在剪贴板里的数据插入到目标元素之前。如果目标元素(光标所在位置)是可编辑的元素(设置了contenteditable属性的div。textarea并不行),粘贴动作将把剪贴板里的数据,以最合适的格式,插入到目标元素里;如果目标元素不可编辑,则不会插入数据,但依然触发paste event。数据在粘贴的过程中是只读的。

监听了paste事件,也知道了表现形式,接下来就是如何获取数据了:

chrome有特定的方法,利用clipboardData.items、getAsFile()、new FileReader()等api可以在paste回调函数里获取到剪贴板里图片的base64编码字符串(无论是截图粘贴的还是网页图片复制粘贴的),ie11,firefox没有这样的api,不过依然有办法可以获取,因为数据已经表现在img的src里了,对于截图粘贴的,直接取img的src属性值(base64),对于网页粘贴的,则把地址传给后台,然后根据地址down下来,存在自己的服务器,最后把新地址返回来交给前端展示就ok了。为了保持一致性便于管理,统一将所有情况(截图、网页)中的img的src属性替换为自己存储的地址。

完整例子:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Js实现粘贴上传图片</title>
    <script src="jquery.js"></script>
</head>

<body>
    复制粘贴上传图片:
    <div id="content_img" contentEditable="true" style="width:500px;height:500px;border:1px solid #000;"></div>
    <script>
        document.getElementById('content_img').addEventListener('paste', function(e) {
        if (!(e.clipboardData && e.clipboardData.items)) {
            return;
        }
        for (var i = 0, len = e.clipboardData.items.length; i < len; i++) {
            var item = e.clipboardData.items[i];
            if (item.kind === "string") {
                item.getAsString(function(str) {
                    console.log(str);
                    alert("请粘贴图片上传");
                })
                $("#content_img").html(""); 
            } else if (item.kind === "file") {
                var blob = item.getAsFile();
                console.log(blob);
                if (blob.size === 0) {
                    return;
                }
                var data = new FormData();
                data.append("image", blob);
                $.ajax({
                    url: "http://www.yzmcms.com/upload.php",
                    type: 'POST',
                    cache: false,
                    data: data,
                    processData: false,
                    contentType: false,
                    dataType: "json", 
                    success: function(result) {
                        console.log(result);
                        if (result.status) {
                            var html = "<img src=" + result.data + " width='100' height='100'>";
                            $("#content_img").append(html);
                        } else {
                            console.log(result.message)
                        }
                    }
                });

                //阻止默认行为即不让剪贴板内容在div中显示出来
                e.preventDefault();
            }
        }
    });
    </script>
</body>

</html>

以上就是Js实现粘贴上传图片的原理及示例的详细内容,更多关于JS 粘贴上传图片的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
通过ifame指向的页面高度调整iframe的高度
Oct 05 Javascript
javascript-TreeView父子联动效果保持节点状态一致
Aug 12 Javascript
jquery学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
js与jQuery 获取父窗、子窗的iframe
Dec 20 Javascript
javascript设计模式之解释器模式详解
Jun 05 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
Nov 28 Javascript
node.js中的console.warn方法使用说明
Dec 09 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
Mar 17 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
Jun 16 Javascript
angularjs实现过滤并替换关键字小功能
Sep 19 Javascript
react 应用多入口配置及实践总结
Oct 17 Javascript
vant自定义二级菜单操作
Nov 02 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
Dec 09 #Javascript
使用typescript快速开发一个cli的实现示例
Dec 09 #Javascript
ES6中的类(Class)示例详解
Dec 09 #Javascript
JavaScript实现表单验证功能
Dec 09 #Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 08 #Javascript
javascript全局自定义鼠标右键菜单
Dec 08 #Javascript
javascript局部自定义鼠标右键菜单
Dec 08 #Javascript
You might like
CI框架自动加载session出现报错的解决办法
2014/06/17 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
基于jquery.page.js实现分页效果
2018/01/01 jQuery
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
javascript实现评分功能
2020/06/24 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
python中dir函数用法分析
2015/04/17 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
Python pymongo模块用法示例
2018/03/31 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
《争吵》教学反思
2014/02/15 职场文书
出纳担保书范文
2014/04/02 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
听证通知书
2015/04/24 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS