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 相关文章推荐
JavaScript实现禁止后退的方法
Dec 27 Javascript
js 解决“options为空或不是对象”
Dec 22 Javascript
Javascript调用C#代码
Jan 17 Javascript
jQuery中filter()和find()的区别深入了解
Sep 25 Javascript
带左右箭头图片轮播的JS代码
Dec 18 Javascript
js控制浏览器全屏示例代码
Feb 20 Javascript
JQuery中属性过滤选择器用法实例分析
May 18 Javascript
jQuery实现的淡入淡出二级菜单效果代码
Sep 15 Javascript
Bootstrap每天必学之模态框(Modal)插件
Apr 26 Javascript
JQuery Mobile 弹出式登录框的实现方法
May 28 Javascript
jQuery实现点击图标div循环放大缩小功能
Sep 30 jQuery
微信小程序用户拒绝授权的处理方法详解
Sep 20 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
如何设置mysql允许外网访问
2013/06/04 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
详解PHP中的PDO类
2015/07/06 PHP
PHP 断点续传实例详解
2017/11/11 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
python 字符串split的用法分享
2013/03/23 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
Linux文件系统类型
2012/09/16 面试题
公务员政审单位鉴定材料
2014/05/16 职场文书
考试诚信承诺书
2014/05/23 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
迎新生欢迎词
2015/01/23 职场文书
长城导游词300字
2015/01/30 职场文书