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 表单的友好用户体现
Jan 07 Javascript
Jquery下判断Id是否存在的代码
Jan 06 Javascript
将list转换为json失败的原因
Dec 17 Javascript
js兼容火狐显示上传图片预览效果的方法
May 21 Javascript
js+html5实现canvas绘制镂空字体文本的方法
Jun 05 Javascript
javascript单例模式的简单实现方法
Jul 25 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
May 25 Javascript
关于Vue.js一些问题和思考学习笔记(1)
Dec 02 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
Dec 14 Javascript
Vue中的v-cloak使用解读
Mar 27 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
vue中使用better-scroll实现滑动效果及注意事项
Nov 15 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类的特性实例分析
2016/09/28 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
AngularJS 模型详细介绍及实例代码
2016/07/27 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
python删除文本中行数标签的方法
2018/05/31 Python
django解决跨域请求的问题
2018/11/11 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
值得收藏的10道python 面试题
2019/04/15 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
高中英语教学反思
2014/02/04 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
Python利用FlashText算法实现替换字符串
2022/03/31 Python