js實現ctrl+v上傳圖片


描述:實現類似QQ截圖刪上傳圖片的功能

a、需要的js插件

paste.image.js
地址:https://github.com/iyangyuan/pasteimg

b、paste.image.js

(function($,exports){
  $.fn.extend({
    pasteImage: function(callback){
      var util = {
        /*
        *  @function:
        *    從指定類繼承,並且帶簡單數據構造器
        *  @params:
        *    parent 0個構造參數的父類,默認Object
        *  @return:
        *    子類,可以訪問父類的prototype屬性
        */
        extend: function(parent){
          /*
          *  @example:
          *    if the param construct={name: "nadel"};
          *    then the function construct will like:
          *    function(name){
          *      this.name = name;
          *    }
          */
          parent = parent || Object;
          var fn = function(construct){
            var attribute = "";
            for(attribute in construct){
              if(Object.prototype.hasOwnProperty.call(construct, attribute)){
                this[attribute] = construct[attribute];
              }
            }
          };
          fn.prototype = new parent();
          strategys.push(fn);
          
          return fn;
        },
        /*
        *  @function:
        *    遍歷數組中的object,根據正則匹配指定屬性
        *  @params:
        *    array object數組
        *    property object屬性
        *    regex object屬性值正則表達式
        *  @return:
        *    匹配到的object數組
        */
        getProperty: function(array, property, regex){
          var result = [],
              i = 0;
          for(i = 0; i<array.length; i++){
            if(regex.test(array[i][property])){
              result.push(array[i]);
            }
          }
          return result;
        },
        /*
        *  @function:
        *    將image document對象轉換為DataUrl
        *  @params:
        *    element: image document對象,可以用document.getElementById獲取
        *    type: 生成的圖片類型,例如:image/png,默認為image/png
        *  @return:
        *    DataUrl
        */
        imageToDataUrl: function(element, type){
          type = type || "image/png";
          try{
            //利用canvas獲取圖片的DataUrl,但受跨域限制
            var canvas = document.createElement('canvas'),
                ctx = canvas.getContext('2d'),
                result = "";
            canvas.width = element.width;
            canvas.height = element.height;
            ctx.drawImage(element, 0, 0);
            result = canvas.toDataURL(type);
            if(result === "data:,"){
              result = "";
            }
            
            return result;
          }catch(e){
            //目標服務器不允許跨域訪問資源
            return "";
          }
        },
        /*
        *  @functions:
        *    將一個類數組中的數據push到真正的數組中
        *  @params:
        *    array 數組
        *    arrayLike 類數組
        */
        arrayLikePush: function(array, arrayLike){
          var i = 0;
          for(i = 0;i<arrayLike.length;i++){
            array.push(arrayLike[i]);
          }
        }
      },
      strategys = [],
      strategy = {},
      i = 0;
      
      //算法類(接口)
      var Strategy = function(){};
      Strategy.prototype.exec = function(){
        //意在必須重寫
        throw new Error("The method 'chrome' must be override!");
      };
      Strategy.prototype.isSuport = function(){
        throw new Error("The method 'chrome' must be override!");
      };
      
      //谷歌瀏覽器算法
      var Chrome = util.extend(Strategy);
      Chrome.prototype.exec = function(){
        var that = this;
        that.$element.on("paste",function(event){
          var items = (event.clipboardData || event.originalEvent.clipboardData).items,
              //取出html對象
              htmlBlobs = util.getProperty(items, "type", /^text\/html$/im),
              imgElements = [],
              loadedCount = 0,
              htmlImages = [],
              htmlResults = [],
              reader = {},
              parseFinish = function(){
                var $html = {},
                    $imageLoadDiv = {};
                
                if(htmlResults.length === htmlBlobs.length){
                  //解析html中的圖片
                  for(k = 0;k<htmlResults.length;k++){
                    $html = htmlResults[k].replace(/\n|\r|\n\r/g, "");
                    $html = $html.replace("<html><body>", "<div>");
                    $html = $html.replace("</body></html>", "</div>");
                    $html = $($html);
                    util.arrayLikePush(imgElements, $html.find("img"));
                  }
                  //圖片預加載
                  $("body").append(imageLoadDiv);
                  $imageLoadDiv = $("#paste_image_load");
                  for(k = 0; k<imgElements.length; k++){
                    imgElements[k].onload = imgOnload;
                    $imageLoadDiv.append(imgElements[k]);
                  }
                }
              },
              loadFinish = function(){
                var dataurl = "",
                    k = 0;
                if(imgElements.length === loadedCount){
                  //嘗試將圖像dom轉換成dataurl,如果失敗,返回img src
                  for(k = 0;k<imgElements.length;k++){
                    dataurl = "";
                    dataurl = util.imageToDataUrl(imgElements[k]);
                    if(dataurl){
                      htmlImages.push(dataurl);
                    }else{
                      htmlImages.push(imgElements[k].getAttribute("src"));
                    }
                  }
                  
                  $("#paste_image_load").remove();
                  
                  //返回結果
                  that.callback(htmlImages);
                }
              },
              imgOnload = function(){
                loadedCount = loadedCount+1;
                loadFinish();
              },
              imageLoadDiv = "<div id='paste_image_load' style='height: 0;width: 0;display: none;'></div>",
              i = 0;
          
          //提取html對象中的圖片
          for(i = 0;i<htmlBlobs.length;i++){
            htmlBlobs[i].getAsString(function(html){
              htmlResults.push(html);
              parseFinish();
            });
          }
        });
      };
      Chrome.prototype.isSuport = function(){
        return window.navigator.userAgent.toLowerCase().indexOf("chrome")>-1;
      };
      
      //火狐瀏覽器和IE11瀏覽器算法
      var FirefoxAndIE11 = util.extend(Strategy);
      FirefoxAndIE11.prototype.exec = function(){
        var that = this,
            clipboardDiv = "<div id='paste_content_catch' contentEditable='true' style='position: fixed;left: -9999px;top: -9999px; opacity: 0;'></div>",
            $clipboardDiv = {},
            i = 0;
        
        //初始化clipboard catch
        $("body").append(clipboardDiv);
        $clipboardDiv = $("#paste_content_catch");
        //監聽ctrl+v事件
        that.$element.on("keydown",function(event){
          if(event.ctrlKey == 1 && event.keyCode == 86){
            $clipboardDiv.html("");
            $clipboardDiv.focus();
            //模擬多線程
            setTimeout(function(){
              var id = "paste_image_load_" + new Date().getTime(),
                  imageLoadDiv = "<div id='"+id+"' style='height: 0;width: 0;display: none;'></div>",
                  $imageLoadDiv = {},
                  imageElements = [],
                  images = [],
                  loadedCount = 0;
              
              //獲取剪切板中的img元素
              imageElements = $clipboardDiv.find("img");
              //圖片預加載
              $("body").append(imageLoadDiv);
              $imageLoadDiv = $("#"+id);
              for(i = 0;i<imageElements.length;i++){
                imageElements[i].onload = function(){
                  var dataurl = "",
                      k = 0;
                  
                  loadedCount = loadedCount+1;
                  if(imageElements.length === loadedCount){
                    //嘗試將圖像dom轉換成dataurl,如果失敗,返回img src
                    for(k = 0;k<imageElements.length;k++){
                      dataurl = "";
                      dataurl = util.imageToDataUrl(imageElements[k]);
                      if(dataurl){
                        images.push(dataurl);
                      }else{
                        images.push(imageElements[k].getAttribute("src"));
                      }
                    }
                    
                    $imageLoadDiv.remove();
                    
                    //返回結果
                    that.callback(images);
                  }
                };
                $imageLoadDiv.append(imageElements[i]);
              }
              imageElements = $imageLoadDiv.find("img");
              $clipboardDiv.html("");
              that.$element.focus();
            },0);
          }
        });
      };
      FirefoxAndIE11.prototype.isSuport = function(){
        var result = false;
        
        try{
          result = window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1 || 
                   (Object.hasOwnProperty.call(window, "ActiveXObject") && !window.ActiveXObject);
        }catch(e){}
        
        return result;
      };
      
      //選擇策略
      for(i = 0;i<strategys.length;i++){
        strategy = new strategys[i]({
          $element: $(this),
          callback: callback
        });
        
        if(strategy.isSuport()){
          strategy.exec();
          break;
        }
      }
    }
  });
})(jQuery,this);

  

c、demo.html

<body>
    <input type="text" id="container" placeholder="在這粘貼圖片"/>
    <script>
      $("#container").pasteImage(function(imgs){
        $.each(imgs,function(i,n){
        var  imageData= n.replace("data:image/png;base64,", "");
        var imageUrl=""
		$.ajax({
             type: "POST",
             url: path+"/tmsSellMsg/uploadImageByBase64Code",
             data: {"imageData":imageData},
             dataType: "json",
             async:false,
             success: function(data){
                         imageUrl = data;
                }
			});
           $("body").append("<img src='"+imageUrl+"' >");
        });
      });
    </script>
</body>

d、springmvc

@RequestMapping(value = "/uploadImageByBase64Code", method = RequestMethod.POST)
public @ResponseBody String insertTmsSellMsgByExcel2(String imageData) throws Exception {
	byte[] buf = Base64Utils.decodeFromString(imageData);
	InputStream sbs = new ByteArrayInputStream(buf);
	String imageUrl= OSSUtils.putObject(sbs);
	return JsonUtils.objectToJson(imageUrl);
}

致此結束……

關注我的公眾號,精彩內容不能錯過


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM