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 相关文章推荐
Jquery中获取iframe的代码
Jan 11 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
Jan 08 Javascript
JSON中双引号的轮回使用过程中一定要小心
Mar 05 Javascript
javascript获取元素偏移量的方法有哪些
Jun 24 Javascript
AngularJS中$interval的用法详解
Feb 02 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
Apr 05 Javascript
JavaScript判断是否是微信浏览器
Jun 13 Javascript
Node做中转服务器转发接口
Oct 18 Javascript
最实用的JS数组函数整理
Dec 05 Javascript
jQuery实现的简单日历组件定义与用法示例
Dec 24 jQuery
详解babel升级到7.X采坑总结
May 12 Javascript
vue中data改变后让视图同步更新的方法
Mar 29 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
php数据库配置文件一般做法分享
2012/07/07 PHP
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
PDO::errorCode讲解
2019/01/28 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
js时间控件只显示年月
2017/01/08 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
python数据结构树和二叉树简介
2014/04/29 Python
python 队列详解及实例代码
2016/10/18 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
python区分不同数据类型的方法
2019/10/14 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
护理工作感言
2014/01/16 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
学校中秋节活动总结
2015/03/23 职场文书
初中生物教学反思
2016/02/20 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
html实现弹窗的实例
2021/06/09 HTML / CSS
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL