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 相关文章推荐
对联广告js flash激活
Oct 19 Javascript
javascript加号&quot;+&quot;的二义性说明
Mar 04 Javascript
使用js实现关闭js弹出层的窗口
Feb 10 Javascript
Node.js安装教程和NPM包管理器使用详解
Aug 16 Javascript
EasyUi datagrid 实现表格分页
Feb 10 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
Nov 16 Javascript
详解堆的javascript实现方法
Nov 29 Javascript
Bootstrap CSS组件之输入框组
Dec 17 Javascript
jQuery实现复制到粘贴板功能
Feb 11 Javascript
JS生成随机打乱数组的方法示例
Dec 23 Javascript
使用js原生实现年份轮播选择效果实例
Jan 12 Javascript
使用vue判断当前环境是安卓还是IOS
Apr 12 Vue.js
再也不怕 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
无线电广播的开始
2002/01/30 无线电
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
python连接mysql调用存储过程示例
2014/03/05 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python3下载抖音视频的完整代码
2019/06/05 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
幼儿园元旦家长感言
2014/02/27 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
检讨书格式
2015/05/07 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
刮痧观后感
2015/06/05 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
2016党校学习心得体会
2016/01/07 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers