溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

js如何實現(xiàn)圖片粘貼上傳到服務(wù)器并展示

發(fā)布時間:2021-04-21 11:05:15 來源:億速云 閱讀:266 作者:小新 欄目:web開發(fā)

小編給大家分享一下js如何實現(xiàn)圖片粘貼上傳到服務(wù)器并展示,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

JS是什么

JS是JavaScript的簡稱,它是一種直譯式的腳本語言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發(fā),可以給網(wǎng)站添加各種各樣的動態(tài)效果,讓網(wǎng)頁更加美觀。

最近看了一些有關(guān)于js實現(xiàn)圖片粘貼上傳的demo,實現(xiàn)如下: (這里只能檢測到截圖粘貼和圖片右鍵復(fù)制之后粘貼)

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比較有意思,初步判斷是根據(jù)mime類型來的,即有幾種mime類型,長度就是幾(待驗證)
     //如果粘貼純文本,那么len=1,如果粘貼網(wǎng)頁圖片,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 );

     //阻止默認(rèn)行為即不讓剪貼板內(nèi)容在div中顯示出來
     event.preventDefault();

     //在items里找粘貼的image,據(jù)上面分析,需要循環(huán)
     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 () {
      //設(shè)置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 如果是復(fù)制的其他網(wǎng)頁圖片那么src_str就是此圖片在別人服務(wù)器的地址
        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);
   }
  })

  //調(diào)用圖片上傳接口,將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]; //設(shè)置上傳完圖片之后展示的圖片
        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);
   //阻止默認(rèn)行為即不讓剪貼板內(nèi)容在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]; //設(shè)置上傳完圖片之后展示的圖片
       editor.appendChild(img);
      }
     },
     error: function(){
      alert("上傳圖片錯誤");
     }
    });
   }
  }

注意:因為只支持右鍵復(fù)制圖片,所以并不能一下復(fù)制兩張圖片,所有圖片復(fù)制并粘貼上傳待研究.

html:

<div id="aaa" contentEditable="true" ></div>

接口返回數(shù)據(jù)格式:

{
 // errno 即錯誤代碼,0 表示沒有錯誤。
 //  如果有錯誤,errno != 0,可通過下文中的監(jiān)聽函數(shù) fail 拿到該錯誤碼進行自定義處理
 errno: 0,

 // data 是一個數(shù)組,返回若干圖片的線上地址
 data: [
  '圖片1地址',
  '圖片2地址',
  '……'
 ]
}

看完了這篇文章,相信你對“js如何實現(xiàn)圖片粘貼上傳到服務(wù)器并展示”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

js
AI