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 相关文章推荐
图片自动缩小 点击放大
Jul 07 Javascript
javascript 学习笔记(一)DOM基本操作
Apr 08 Javascript
提示$ is not defined错误分析及解决
Apr 09 Javascript
jquery 无限级下拉菜单的简单实现代码
Feb 21 Javascript
JavaScript动态添加style节点的方法
Jun 09 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
JS学习之表格的排序简单实例
May 16 Javascript
JS仿京东移动端手指拨动切换轮播图效果
Apr 10 Javascript
微信小程序 scroll-view组件实现列表页实例代码
Dec 14 Javascript
Vue中util的工具函数实例详解
Jul 08 Javascript
JavaScript常用进制转换及位运算实例解析
Oct 14 Javascript
编写v-for循环的技巧汇总
Dec 01 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
php sprintf()函数让你的sql操作更安全
2008/07/23 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
node.js操作MongoDB的实例详解
2017/10/11 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
js实现开关灯效果
2020/03/30 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
python实现kmp算法的实例代码
2019/04/03 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
复核员上岗演讲稿
2014/01/05 职场文书
社区学雷锋活动策划方案
2014/01/30 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
国企干部对照检查材料
2014/08/22 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python