js实现图片粘贴上传到服务器并展示的实例


Posted in Javascript onNovember 08, 2017

最近看了一些有关于js实现图片粘贴上传的demo,实现如下: (这里只能检测到截图粘贴和图片右键复制之后粘贴)

demo1:

document.addEventListener('paste', function (event) {
   console.log(event)
   var isChrome = false;
   if ( event.clipboardData || event.originalEvent ) {
    //not for ie11 某些chrome版本使用的是event.originalEvent
    var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
    if ( clipboardData.items ) {
     // for chrome
     var items = clipboardData.items,
      len = items.length,
      blob = null;
     isChrome = true;
     //items.length比较有意思,初步判断是根据mime类型来的,即有几种mime类型,长度就是几(待验证)
     //如果粘贴纯文本,那么len=1,如果粘贴网页图片,len=2, items[0].type = 'text/plain', items[1].type = 'image/*'
     //如果使用截图工具粘贴图片,len=1, items[0].type = 'image/png'
     //如果粘贴纯文本+HTML,len=2, items[0].type = 'text/plain', items[1].type = 'text/html'
     // console.log('len:' + len);
     // console.log(items[0]);
     // console.log(items[1]);
     // console.log( 'items[0] kind:', items[0].kind );
     // console.log( 'items[0] MIME type:', items[0].type );
     // console.log( 'items[1] kind:', items[1].kind );
     // console.log( 'items[1] MIME type:', items[1].type );

     //阻止默认行为即不让剪贴板内容在div中显示出来
     event.preventDefault();

     //在items里找粘贴的image,据上面分析,需要循环
     for (var i = 0; i < len; i++) {
      if (items[i].type.indexOf("image") !== -1) {
       //getAsFile() 此方法只是living standard firefox ie11 并不支持
       blob = items[i].getAsFile();
       uploadImgFromPaste(blob, 'paste', isChrome);
      }
     }

     /*if ( blob !== null ) {
      var reader = new FileReader();
      reader.onload = function (event) {
       // event.target.result 即为图片的Base64编码字符串
       var base64_str = event.target.result;//获得图片base64字符串
       //可以在这里写上传逻辑 直接将base64编码的字符串上传(可以尝试传入blob对象,看看后台程序能否解析)
      uploadImgFromPaste(base64_str, 'paste', isChrome);
      }
      reader.readAsDataURL(blob);//传入blob对象,读取文件
     }*/
    } else {
     //for firefox
     setTimeout(function () {
      //设置setTimeout的原因是为了保证图片先插入到div里,然后去获取值
      var imgList = document.querySelectorAll('#aaa img'),
       len = imgList.length,
       src_str = '',
       i;
      for ( i = 0; i < len; i ++ ) {
       if ( imgList[i].className !== 'my_img' ) {
        //如果是截图那么src_str就是base64 如果是复制的其他网页图片那么src_str就是此图片在别人服务器的地址
        src_str = imgList[i].src;
       }
      }
      uploadImgFromPaste(src_str, 'paste', isChrome);
     }, 1);
    }
   } else {
    //for ie11
    setTimeout(function () {
     var imgList = document.querySelectorAll('#aaa img'),
      len = imgList.length,
      src_str = '',
      i;
     for ( i = 0; i < len; i ++ ) {
      if ( imgList[i].className !== 'my_img' ) {
       src_str = imgList[i].src;
      }
     }
     uploadImgFromPaste(src_str, 'paste', isChrome);
    }, 1);
   }
  })

  //调用图片上传接口,将file文件以formData形式上传
  function uploadImgFromPaste (file, type, isChrome) {
   var formData = new FormData();
   formData.append('files', file);
   formData.append('submission-type', type);

   var xhr = new XMLHttpRequest();
   xhr.open('POST', '/upload_editor_photo3');
   xhr.onload = function () {
    console.log(xhr.readyState);
    if ( xhr.readyState === 4 ) {
     if ( xhr.status === 200 ) {
      var data = JSON.parse(xhr.responseText),
       editor = document.getElementById('aaa');
      if ( isChrome ) {
       var len=data.data.length;
       for ( var i = 0; i < len; i ++) {
        var img = document.createElement('img');
        img.className = 'my_img';
        img.src = data.data[i]; //设置上传完图片之后展示的图片
        editor.appendChild(img);
       }
      } else {
       var imgList = document.querySelectorAll('#aaa img'),
        len = imgList.length,
        i;
       for ( i = 0; i < len; i ++) {
        if ( imgList[i].className !== 'my_img' ) {
         imgList[i].className = 'my_img';
         imgList[i].src = data.data[i];
        }
       }
      }

     } else {
      console.log( xhr.statusText );
     }
    };
   };
   xhr.onerror = function (e) {
    console.log( xhr.statusText );
   }
   xhr.send(formData);
  }

demo2:

// 处理粘贴事件
  $("#aaa").on('paste', function(eventObj) {
   // 处理粘贴事件
   var event = eventObj.originalEvent;
   var imageRe = new RegExp(/image\/.*/);
   var fileList = $.map(event.clipboardData.items, function (o) {
    if(!imageRe.test(o.type)){ return }
    var blob = o.getAsFile();
    return blob;
   });
   if(fileList.length <= 0){ return }
   upload(fileList);
   //阻止默认行为即不让剪贴板内容在div中显示出来
   event.preventDefault();
  });
  function upload(fileList) {
   for(var i = 0, l = fileList.length; i < l; i++){
    var fd = new FormData();
    var f = fileList[i];
    fd.append('files', f);
    var editor=document.getElementById("aaa");
    $.ajax({
     url:"/upload_editor_photo3",
     type: 'POST',
     dataType: 'json',
     data: fd,
     processData: false,
     contentType: false,
     xhrFields: { withCredentials: true },
     headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Credentials': 'true'
     },
     success: function(res){
      var len=res.data.length;
      for ( var i = 0; i < len; i ++) {
       var img = document.createElement('img');
       img.src = res.data[i]; //设置上传完图片之后展示的图片
       editor.appendChild(img);
      }
     },
     error: function(){
      alert("上传图片错误");
     }
    });
   }
  }

注意:因为只支持右键复制图片,所以并不能一下复制两张图片,所有图片复制并粘贴上传待研究.

html:

<div id="aaa" contentEditable="true" style="height:800px;border:1px solid #ccc"></div>

接口返回数据格式:

{
 // errno 即错误代码,0 表示没有错误。
 //  如果有错误,errno != 0,可通过下文中的监听函数 fail 拿到该错误码进行自定义处理
 errno: 0,

 // data 是一个数组,返回若干图片的线上地址
 data: [
  '图片1地址',
  '图片2地址',
  '……'
 ]
}

以上这篇js实现图片粘贴上传到服务器并展示的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习JS面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 Javascript
jQuery表单验证插件formValidator(改进版)
Feb 03 Javascript
javascript 二进制运算技巧解析
Nov 27 Javascript
javascript中直接写php代码的方法
Jul 31 Javascript
使用js实现雪花飘落效果
Aug 26 Javascript
浅谈重写window对象的方法
Dec 29 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 Javascript
vue在手机中通过本机IP地址访问webApp的方法
Aug 15 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
Dec 12 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
vue实现仿淘宝结账页面实例代码
Nov 08 #Javascript
vue-router路由与页面间导航实例解析
Nov 07 #Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
Nov 07 #Javascript
EasyUI实现下拉框多选功能
Nov 07 #Javascript
ES6中字符串string常用的新增方法小结
Nov 07 #Javascript
ES6中数组array新增方法实例总结
Nov 07 #Javascript
vue组件父子间通信详解(三)
Nov 07 #Javascript
You might like
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
js实现楼层导航功能
2017/02/23 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
python 设置文件编码格式的实现方法
2017/12/21 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
详解Python中第三方库Faker
2020/09/25 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
写给爸爸的道歉信
2014/01/15 职场文书
节约用水倡议书
2014/04/16 职场文书
合作经营协议书范本
2014/09/16 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
python中对列表的删除和添加方法详解
2022/02/24 Python