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 相关文章推荐
tagName的使用,留一笔
Jun 26 Javascript
自动更新作用
Oct 08 Javascript
不要在cookie中使用特殊字符的原因分析
Jul 13 Javascript
一个挺有意思的Javascript小问题说明
Sep 26 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
Jan 30 Javascript
jquery 滚动条事件简单实例
Jul 12 Javascript
学习Javascript闭包(Closure)知识
Aug 07 Javascript
AngularJS 文件上传控件 ng-file-upload详解
Jan 13 Javascript
JavaScript生成指定范围随机数和随机序列的方法
May 05 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 Javascript
angular中的post请求处理示例详解
Jun 30 Javascript
JavaScript常用进制转换及位运算实例解析
Oct 14 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
How do I change MySQL timezone?
2008/03/26 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
几个有趣的Javascript Hack
2010/07/24 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
JS实现进度条动态加载特效
2020/03/25 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python表格存取的方法
2018/03/07 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
PHP如何去执行一个SQL语句
2016/03/05 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
小学语文业务学习材料
2014/06/02 职场文书
体育课外活动总结
2014/07/08 职场文书
搞笑的获奖感言
2014/08/16 职场文书
招标承诺书
2014/08/30 职场文书
2015年加油站工作总结
2015/05/13 职场文书
吴仁宝观后感
2015/06/09 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书