KindEditor粘贴时候自动上传远程图片(非本地)

KindEditor版本:4.1.10 (2013-11-23),具体可以去官网下载:http://kindeditor.net/down.php

基本的配置这里不说了,官网有文档,贴代码:

[html] view plain copy
  1. <textarea id="content" style="width:80%;height:100px;">textarea>  
[javascript] view plain copy
  1. //定义编辑器对象  
  2. var editor;  
  3.   
  4. //异步加载编辑器  
  5. $.getScript('../kindeditor/kindeditor-min.js'function () {  
  6.     KindEditor.basePath = '../kindeditor/';  
  7.     editor = KindEditor.create('textarea[id="content"]', {  
  8.             id : 'editor_id',  
  9.             uploadJson : '../kindeditor/asp.net/upload_json.ashx',  
  10.             fileManagerJson : '../kindeditor/asp.net/file_manager_json.ashx',  
  11.             allowFileManager : true//默认false  
  12.             resizeType : 1,  
  13.             items : [  
  14.                 'undo''redo''|',  
  15.                 'fontname''fontsize''|',  
  16.                 'forecolor''hilitecolor''bold''italic''underline''removeformat''|',  
  17.                 'justifyleft''justifycenter''justifyright''insertorderedlist''insertunorderedlist''|',  
  18.                 'image''link''|''preview'],  
  19.             autoHeightMode : true//默认值: false  
  20.             afterCreate : function () {  
  21.                 this.loadPlugin('autoheight');  
  22.   
  23.                 var __doc = this.edit.doc;  
  24.                 //KindEditor.ctrl(__doc, 'V', function () {  
  25.                 //    alert('123');  
  26.                 //});  
  27.                 $(__doc).bind('paste'nullfunction () { //右键粘贴, 包括 ctrl+v  
  28.                     setTimeout(function () {  
  29.                         parent.uploadWebImg(editor);  
  30.                     }, 200);  
  31.                 });  
  32.             },  
  33.             afterChange : function () {  
  34.                 $('.word_count').html(this.count()); //(字数统计包含HTML代码。)  
  35.             },  
  36.         });  
  37. });  
这里注意,要修改下kindeditor-min.js这个文件中的一个地方,不然粘贴的文本在事件响应之后(表现就是没有内容粘贴到编辑器中)

通过源代码可以在这里看到:https://github.com/kindsoft/kindeditor/blob/master/kindeditor-all.js

影响的具体方法就看自己这么写了,我的uploadWebImg代码贴到下面,用的layer弹窗组件,具体看它的官网api,这里不多说。

[javascript] view plain copy
  1. //上传远程图片  
  2. function uploadWebImg(editor) {  
  3.     var relaceSrc = []; //图片地址对象容器  
  4.     var imgs = $(editor.html()).find('img');  
  5.   
  6.     imgs.map(function () {  
  7.         var _src = $(this).attr('src');  
  8.         //if ((_src.indexOf('http://') >= 0 || _src.indexOf('https://') >= 0) && checkimgok(_src)) {  
  9.         if (_src.indexOf('http://') >= 0 || _src.indexOf('https://') >= 0) { //考虑可能有动态生成的图片  
  10.             relaceSrc.push({ k: _src });  
  11.         };  
  12.     });  
  13.   
  14.     if (relaceSrc.length == 0) return;  
  15.   
  16.     var msg = '内容包含' + relaceSrc.length.toString() + '张远程图片,是否现在上传?';  
  17.   
  18.     confirmLayerNormal(msg, function (_index) {  
  19.         var loading = layer.load(0);  
  20.         var paramdata = {  
  21.             action: "791c252eee12530f4f3af326674b7d97",  
  22.             arg: { imgs: relaceSrc },  
  23.         };  
  24.   
  25.         doAjaxPost(paramdata, function (result) {  
  26.             layer.close(loading);  
  27.             if (!result.success) {  
  28.                 SuperSite.MsgError(result.msg);  
  29.                 return;  
  30.             }  
  31.   
  32.             //替换编辑器图片源  
  33.             var _content = editor.html();  
  34.             $(relaceSrc).each(function (idx, dom) {  
  35.                 _content = _content.replace(dom.k, result.data[idx].value);  
  36.             });  
  37.             editor.html(_content);  
  38.   
  39.             SuperSite.MsgOK('远程图片上传成功');  
  40.         });  
  41.         layer.close(_index);  
  42.     });  
  43. };  

服务端的代码:
[csharp] view plain copy
  1. ///   
  2. /// 上传远程图片  
  3. ///   
  4. private void UploadWebImg()  
  5. {  
  6.     var ajaxdata = base.GetActionParamData();  
  7.     if (ajaxdata == null || ajaxdata.imgs == null || ajaxdata.imgs.Count == 0)  
  8.         Outmsg(false, outmsg: "未获取到上传的图片地址");  
  9.   
  10.     var len = ajaxdata.imgs.Count;  
  11.     var tempurl = new List();  
  12.     var stkimg = new Stack(len); //上传栈列  
  13.   
  14.     for (int i = 0; i < len; i++)  
  15.     {  
  16.         var img = ajaxdata.imgs[i].k.Trim();  
  17.   
  18.         if (stkimg.Any(x => x.value == img))  //刚刚上传过了(说明有重复的图片要上传)  
  19.         {  
  20.             var loadedpath = stkimg.First(x => x.value == img).value;  
  21.             tempurl.Add(new KeyValueDesc  
  22.             {  
  23.                 key = i.ToString(),  
  24.                 value = loadedpath,  
  25.                 desc = (int)EnumCenter.UploadImgStatus.Repeat  
  26.             });  
  27.             continue;  
  28.         }  
  29.   
  30.         var tb = DownLoadWebImg(img);  
  31.         stkimg.Push(new KeyValue { key = i.ToString(), value = tb.Item2 }); //推入栈  
  32.         tempurl.Add(new KeyValueDesc  
  33.         {  
  34.             key = i.ToString(),  
  35.             value = tb.Item2,  
  36.             desc = tb.Item1 ?  
  37.             (int)EnumCenter.UploadImgStatus.OK :  
  38.             (int)EnumCenter.UploadImgStatus.Error  
  39.         });  
  40.     }  
  41.   
  42.     Outmsg(true, outdata: tempurl);  
  43. }  
  44. private Tuple<boolstring> DownLoadWebImg(string url)  
  45. {  
  46.     try  
  47.     {  
  48.         var dt = DateTime.Now;  
  49.         var folder = "/upload/image/" + dt.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo) + "/";  
  50.         var newfile = dt.ToString("HHmmss_ffff", DateTimeFormatInfo.InvariantInfo)   
  51.                     + url.Substring(url.LastIndexOf('.')); //扩展名(带.号)  
  52.         var filepath = Server.MapPath(folder);  
  53.   
  54.         if (!Directory.Exists(filepath))  
  55.         {  
  56.             Directory.CreateDirectory(filepath);  
  57.         }  
  58.   
  59.         using (WebClient mywebclient = new WebClient())  
  60.         {  
  61.             mywebclient.DownloadFile(url, filepath + newfile);  
  62.             return new Tuple<boolstring>(true, folder + newfile);  
  63.         }  
  64.     }  
  65.     catch (Exception ex)  
  66.     {  
  67.         Tools.LogHelp.WriteLog("下载远程图片失败", ex);  
  68.         return new Tuple<boolstring>(false, url); //返回原图地址  
  69.     }  
  70. }