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 相关文章推荐
ExtJS 2.2.1的grid控件在ie6中的显示问题
May 04 Javascript
关于JS管理作用域的问题
Apr 10 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
Apr 22 Javascript
javascript检查浏览器是否支持flash的实现代码
Aug 14 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
May 03 Javascript
js定义类的几种方法(推荐)
Jun 08 Javascript
JavaScript DOM节点操作方法总结
Aug 23 Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 Javascript
Bootstrap模态框插入视频的实现代码
Jun 25 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
Nov 20 Javascript
Vue的事件响应式进度条组件实例详解
Feb 04 Javascript
JavaScript实现点击自制菜单效果
Feb 02 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生成Flash动画的实现代码
2010/03/12 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
javascript实现滑动解锁功能
2014/12/31 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
python sys模块sys.path使用方法示例
2013/12/04 Python
python基础教程之数字处理(math)模块详解
2014/03/25 Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
营业经理岗位职责
2013/11/10 职场文书
大学四年规划书范文
2013/12/27 职场文书
寒假思想汇报
2014/01/10 职场文书
教师求职自荐信
2015/03/26 职场文书
小学教师工作总结2015
2015/04/07 职场文书
高一化学教学反思
2016/02/22 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang