summernote 复制粘贴上传图片

转载:http://www.5180it.com:8080/bbs/admin/1/98.html


在使用summernote过程中,经常会上传图片,但如果我们每次都点击上传图片,使用起来不是特别方便。

现在希望能够直接复制粘贴图片,说做就做,一下是我从网上找到的例子

其中样式 note-editable 是summernote自动生成出来

//summernote

//监听粘贴图片

document.getElementsByClassName('note-editable')[0].addEventListener('paste',function(e){

    if ( !(e.clipboardData && e.clipboardData.items) ) {

        return;

    }

    for (var i = 0, len = e.clipboardData.items.length; i < len; i++) {

        var item = e.clipboardData.items[i];


        if (item.kind === "string") {

            item.getAsString(function (str) {

                console.log(str);

            })

        } else if (item.kind === "file") {

            var f= item.getAsFile();

parseFile(f, 800,function(base64){

$.post("/manager/uploadImg",{"imgStr":base64},function(data){

$('#summernote').summernote('editor.insertImage', data.msg);

});

})

            console.log(f);

        }

    }

});

 这里说明一下这个parseFile方法,就是将图片转化为base64编码,并压缩base64编码,然后上传到服务器。

代码我也贴出来吧:

这里说明一下这个parseFile方法,就是将图片转化为base64编码,并压缩base64编码,然后上传到服务器。

代码我也贴出来吧:

//压缩方法

function parseFile(file, w,callBack) {

 var reader = new FileReader();

 reader.readAsDataURL(file);

 reader.onload = function(e){

  var newImage = new Image();

  var quality = 0.7; //压缩系数0-1之间

  newImage.src = reader.result;

  console.log("原来长度",reader.result.length)

  newImage.setAttribute("crossOrigin", 'Anonymous'); //url为外域时需要

  var imgWidth, imgHeight;

  newImage.onload = function () {

   imgWidth = this.width;

   imgHeight = this.height;

   var canvas = document.createElement("canvas");

   var ctx = canvas.getContext("2d");

   if (Math.max(imgWidth, imgHeight) > w) {

    if (imgWidth > imgHeight) {

     canvas.width = w;

     canvas.height = w * imgHeight / imgWidth;

    } else {

     canvas.height = w;

     canvas.width = w * imgWidth / imgHeight;

    }

   } else {

    canvas.width = imgWidth;

    canvas.height = imgHeight;

    quality = 0.7;

   }

   ctx.clearRect(0, 0, canvas.width, canvas.height);

   ctx.drawImage(this, 0, 0, canvas.width, canvas.height);

   var base64 = canvas.toDataURL("image/jpeg", quality); //压缩语句

   // 如想确保图片压缩到自己想要的尺寸,如要求在50-150kb之间,请加以下语句,quality初始值根据情况自定

   while (base64.length / 1024 > 100) {

     quality -= 0.01;

     base64 = canvas.toDataURL("image/jpeg", quality);

   }

   // 防止最后一次压缩低于最低尺寸,只要quality递减合理,无需考虑

   // while (base64.length / 1024 < 50) {

   // quality += 0.001;

   // base64 = canvas.toDataURL("image/jpeg", quality);

   // }

   console.log("压缩后长度",base64.length)

   callBack(base64)

  }

 }

}

该例子没有将Base64转为file的例子,我也找了个例子出来

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import org.springframework.web.multipart.MultipartFile;

public class BASE64DecodedMultipartFile implements MultipartFile {

 private final byte[] imgContent;

 private final String header;

 public BASE64DecodedMultipartFile(byte[] imgContent, String header) {

  this.imgContent = imgContent;

  this.header = header.split(";")[0];

 }

 @Override

 public String getName() {

  return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];

 }

 @Override

 public String getOriginalFilename() {

  return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];

 }

 @Override

 public String getContentType() {

  return header.split(":")[1];

 }

 @Override

 public boolean isEmpty() {

  return imgContent == null || imgContent.length == 0;

 }

 @Override

 public long getSize() {

  return imgContent.length;

 }

 @Override

 public byte[] getBytes() throws IOException {

  return imgContent;

 }

 @Override

 public InputStream getInputStream() throws IOException {

  return new ByteArrayInputStream(imgContent);

 }

 @Override

 public void transferTo(File file) throws IOException, IllegalStateException {

  new FileOutputStream(file).write(imgContent);

 }

}

import org.springframework.web.multipart.MultipartFile;

import sun.misc.BASE64Decoder;

public class Base64StrToImage {

 public static MultipartFile base64MutipartFile(String imgStr) {

  try {

   String[] baseStr = imgStr.split(",");

   BASE64Decoder base64Decoder = new BASE64Decoder();

   byte[] b = new byte[0];

   b = base64Decoder.decodeBuffer(baseStr[1]);

   for (int i = 0; i < b.length; ++i) {

    if (b[i] < 0) {

     b[i] += 256;

    }

   }

   return new BASE64DecodedMultipartFile(b, baseStr[0]);

  } catch (Exception e) {

   e.printStackTrace();

   return null;

  }

 }

}

通过下面的方法,我们就可以转为我们平时上传使用的MultipartFile了

         BASE64DecodedMultipartFile base64DecodedMultipartFile = null;

            if(StringUtils.isNotEmpty(imgStr)){

               base64DecodedMultipartFile = (BASE64DecodedMultipartFile) Base64StrToImage.base64MutipartFile(imgStr);

            }

在使用的过程中,我发现粘贴是可以的,但粘贴出来的图片会有两个,一个是原base64的图片,另外一个是上传到服务器返回地址的图片

这是就想可能的没有覆盖到原来的方法,导致重复了,以下是我修改后的例子

$(".summernote").summernote({

            height: '450px',

            //设置Dialog淡入淡出效果

            dialogsFade: true,

            fontNames: ['宋体', '微软雅黑', '楷体', '黑体', '隶书', 'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',

                'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',

                'Tahoma', 'Times New Roman', 'Verdana'],

            lang: 'zh-CN',

            toolbar: [

                ['style', ['style']],

                ['font', ['bold']],

                ['color', ['color']],

                ['insert', ['myphoto']],

                ['view', ['fullscreen']]

            ],

            buttons: {

                myphoto: selectImageButton //自已定义的按钮函数

            },

            callbacks: {

             //onPaste粘贴需要重写,否则粘贴图片时出现重复的图片

             onImageUpload:function(e){

              //console.info("onImageUpload>>>>>>>>");

             },

                onPaste: function (ne) {

                     //ne.preventDefault ? ne.preventDefault() : (ne.returnValue = false);

                     var returnFlag = true;

                     var t_clipboardData;

                     if(typeof ne.clipboardData !='undefined'){

                      returnFlag = false;

                      t_clipboardData = ne.clipboardData;

                     }

                     if(typeof ne.originalEvent.clipboardData !='undefined'){

                      returnFlag = false;

                      t_clipboardData = ne.originalEvent.clipboardData;

                     }

                     if(typeof window.clipboardData !='undefined'){

                      returnFlag = false;

                      t_clipboardData = ne.originalEvent.clipboardData;

                     }

                     if(returnFlag){

                      return;

                     }

                     if(t_clipboardData==null||typeof t_clipboardData =='undefined'){

                      return;

                     }

                   for (var i = 0, len = t_clipboardData.items.length; i < len; i++) {

                       var item = t_clipboardData.items[i];

                       if (item.kind === "file") {

                           var f= item.getAsFile();

                           parseBase64File(f, 800,function(base64){

                       var formData = new FormData();

                        formData.append("imgStr", base64);

                           $.ajax( {

                               url : "/file/image/uploadImgStr",

                            data: formData,

                               type: 'post',

                               cache: false,contentType: false,processData: false,

                               beforeSend: function () {

                                   $.modal.loading("上传中,请稍后...");

                               },

                               success : function(result) {

                                $.modal.closeLoading();

                                   if (result.code == web_status.SUCCESS) {

                                    $('#summernote').summernote('editor.insertImage', result.path);

                                    $.modal.msgSuccess('上传成功')

                                   }else{

                                 $.modal.msgWarning(result.msg)

                                   }

                               },

                               error: function(data){

                                $.modal.closeLoading();

                                   $.modal.alertError("上传失败,HTTP错误。");

                               }

                           });

                  })

                       }

                   }

                }

            }

        })


转载:http://www.5180it.com:8080/bbs/admin/1/98.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355