Home  >  Article  >  Web Front-end  >  Examples to explain how js implements image pasting, uploading to the server and displaying it

Examples to explain how js implements image pasting, uploading to the server and displaying it

小云云
小云云Original
2017-12-23 11:18:171454browse

This article mainly brings you an example of js implementing image pasting, uploading to the server and displaying it. The editor thinks it’s pretty good, so I’ll share it with you now and give it as a reference. Let’s follow the editor to take a look, I hope it can help everyone.

Recently I have seen some demos about js implementation of image pasting and uploading. The implementation is as follows: (Only screenshot pasting and image right-click copying and pasting can be detected here)

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 );

     //阻止默认行为即不让剪贴板内容在p中显示出来
     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, &#39;paste&#39;, 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, &#39;paste&#39;, isChrome);
      }
      reader.readAsDataURL(blob);//传入blob对象,读取文件
     }*/
    } else {
     //for firefox
     setTimeout(function () {
      //设置setTimeout的原因是为了保证图片先插入到p里,然后去获取值
      var imgList = document.querySelectorAll(&#39;#aaa img&#39;),
       len = imgList.length,
       src_str = &#39;&#39;,
       i;
      for ( i = 0; i < len; i ++ ) {
       if ( imgList[i].className !== &#39;my_img&#39; ) {
        //如果是截图那么src_str就是base64 如果是复制的其他网页图片那么src_str就是此图片在别人服务器的地址
        src_str = imgList[i].src;
       }
      }
      uploadImgFromPaste(src_str, &#39;paste&#39;, isChrome);
     }, 1);
    }
   } else {
    //for ie11
    setTimeout(function () {
     var imgList = document.querySelectorAll(&#39;#aaa img&#39;),
      len = imgList.length,
      src_str = &#39;&#39;,
      i;
     for ( i = 0; i < len; i ++ ) {
      if ( imgList[i].className !== &#39;my_img&#39; ) {
       src_str = imgList[i].src;
      }
     }
     uploadImgFromPaste(src_str, &#39;paste&#39;, isChrome);
    }, 1);
   }
  })

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

   var xhr = new XMLHttpRequest();
   xhr.open(&#39;POST&#39;, &#39;/upload_editor_photo3&#39;);
   xhr.onload = function () {
    console.log(xhr.readyState);
    if ( xhr.readyState === 4 ) {
     if ( xhr.status === 200 ) {
      var data = JSON.parse(xhr.responseText),
       editor = document.getElementById(&#39;aaa&#39;);
      if ( isChrome ) {
       var len=data.data.length;
       for ( var i = 0; i < len; i ++) {
        var img = document.createElement(&#39;img&#39;);
        img.className = &#39;my_img&#39;;
        img.src = data.data[i]; //设置上传完图片之后展示的图片
        editor.appendChild(img);
       }
      } else {
       var imgList = document.querySelectorAll(&#39;#aaa img&#39;),
        len = imgList.length,
        i;
       for ( i = 0; i < len; i ++) {
        if ( imgList[i].className !== &#39;my_img&#39; ) {
         imgList[i].className = &#39;my_img&#39;;
         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(&#39;paste&#39;, 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);
   //阻止默认行为即不让剪贴板内容在p中显示出来
   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(&#39;files&#39;, f);
    var editor=document.getElementById("aaa");
    $.ajax({
     url:"/upload_editor_photo3",
     type: &#39;POST&#39;,
     dataType: &#39;json&#39;,
     data: fd,
     processData: false,
     contentType: false,
     xhrFields: { withCredentials: true },
     headers: {
      &#39;Access-Control-Allow-Origin&#39;: &#39;*&#39;,
      &#39;Access-Control-Allow-Credentials&#39;: &#39;true&#39;
     },
     success: function(res){
      var len=res.data.length;
      for ( var i = 0; i < len; i ++) {
       var img = document.createElement(&#39;img&#39;);
       img.src = res.data[i]; //设置上传完图片之后展示的图片
       editor.appendChild(img);
      }
     },
     error: function(){
      alert("上传图片错误");
     }
    });
   }
  }

Note: Because it only supports right-click copying of pictures, you cannot copy two pictures at once. All pictures are copied and pasted for uploading for study.

html:


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

Interface return data format:


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

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

Have you learned it? Hurry up and try it out.

Related recommendations:

jQuery plug-in to implement image pasting in the browser--pasteimg usage guide_jquery

php and ajax And an example of h5 implementing the image upload function

Introduction to the plug-in for ThinkPHP5.0 to implement image upload

The above is the detailed content of Examples to explain how js implements image pasting, uploading to the server and displaying it. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn