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 相关文章推荐
破解Session cookie的方法
Jul 28 Javascript
基于JQuery的日期联动实现代码
Feb 24 Javascript
JavaScript程序中实现继承特性的方式总结
Jun 24 Javascript
AngularJS 入门教程之HTML DOM实例详解
Jul 28 Javascript
遍历js中对象的属性和值的实例
Nov 21 Javascript
Ionic2调用本地SQlite实例
Apr 22 Javascript
jquery submit()不能提交表单的解决方法
Apr 24 jQuery
vue2.0 elementUI制作面包屑导航栏
Feb 22 Javascript
利用Electron简单撸一个Markdown编辑器的方法
Jun 10 Javascript
基于ts的动态接口数据配置的详解
Dec 18 Javascript
Javascript如何实现双指控制图片功能
Feb 25 Javascript
详解Node.js使用token进行认证的简单示例
May 25 Javascript
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环境――Appserv
2006/12/13 PHP
php导入导出excel实例
2013/10/25 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
Python内置函数dir详解
2015/04/14 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
办公室年终个人自我评价
2013/10/28 职场文书
年会主持词结束语
2014/03/27 职场文书
开工典礼策划方案
2014/05/23 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
主持稿开场白
2015/06/01 职场文书
python实现剪贴板的操作
2021/07/01 Python