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 相关文章推荐
FCK调用方法..
Dec 21 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
Jan 11 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 Javascript
JQuery实现table行折叠效果以JSON做数据源
May 26 Javascript
手机端页面rem宽度自适应脚本
May 20 Javascript
JS实现来回出现文字的状态栏特效代码
Oct 31 Javascript
jquery中键盘事件小结
Feb 24 Javascript
ClearTimeout消除闪动实例代码
Feb 29 Javascript
Javascript删除指定元素节点的方法
Jun 21 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
Aug 22 Javascript
JS实现随机抽取三人
Nov 06 Javascript
vue3中provide && inject的使用
Jul 01 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
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
Python找出list中最常出现元素的方法
2016/06/14 Python
python xml解析实例详解
2016/11/14 Python
python清理子进程机制剖析
2017/11/23 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
django fernet fields字段加密实践详解
2019/08/12 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
工程造价专业大专生求职信
2013/10/06 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
维稳工作情况汇报
2014/10/27 职场文书
化工见习报告范文
2014/10/31 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
教师继续教育反思周记
2015/06/25 职场文书
工作简报怎么写
2015/07/21 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android