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 相关文章推荐
解读IE和firefox下JScript和HREF的执行顺序
Jan 12 Javascript
关于二级域名下使用一级域名下的COOKIE的问题
Nov 07 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
JavaScript判断变量是否为空的自定义函数分享
Jan 31 Javascript
js+css实现超简洁的二级下拉菜单效果代码
Sep 07 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
Jun 22 Javascript
JS简单设置下拉选择框默认值的方法
Aug 20 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
Nov 03 Javascript
Vue项目分环境打包的实现步骤
Apr 02 Javascript
Vue实现简易翻页效果源码分享
Nov 08 Javascript
详解JavaScript的变量
Apr 04 Javascript
VUE实现密码验证与提示功能
Oct 18 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
JS中encodeURIComponent函数用php解码的代码
2012/03/01 PHP
php mail to 配置详解
2014/01/16 PHP
php生成随机颜色的方法
2014/11/13 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
Python实现简单的可逆加密程序实例
2015/03/05 Python
python实现在windows服务中新建进程的方法
2015/06/30 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
纽约海:Sea New York
2018/11/04 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
软件项目开发计划书
2014/05/01 职场文书
测控技术自荐信
2014/06/05 职场文书
工业设计专业自荐书
2014/06/05 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
家长反馈意见及建议
2015/06/03 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js