最近项目中使用了kindeditor富文本编辑器插件,项目中要求图片可以直接复制粘贴到文本编辑器中,所以在网上查找到这个大神的解决方法,在此非常感谢这位大神的分享,小弟有冒犯之处请多包涵。
在此将该大神的知识分享下:
路径: http://www.cnblogs.com/cztisthebest/p/5913353.html
路径二: http://www.cnblogs.com/eggTwo/p/6703002.html?utm_source=tuicool&utm_medium=referral
本人扩展了KindEditor4.1.10,使得他能够在Chrome和IE11中直接粘贴复制的图片(比如通过截图工具把图片直接保存在剪切板中),然后调用上传URL上传图片
方法,修改kindeditor.js中的代码:
在5825行附近大概是下面这个样子的:
//在5825行附近大概是下面这个样子的:
1. K(doc.body).bind('paste', function (e) { 2. if (self.pasteType === 0) { 3. e.stop(); 4. return; 5. }
.. ....
.. ....
.. ....
}
在第1行和第2行之间插入下面代码:
//处理IE11,Chrome粘贴图片上传 function dopasteImg() { //debugger; var file = null; if (window.clipboardData) {//ie if (clipboardData.files && clipboardData.files.length)//IE11 file = clipboardData.files[0]; else if (!clipboardData.getData("text") && !clipboardData.getData("url")) { alert("不能粘贴文件或图片,请使用IE11或者Chrome浏览器,或使用上传功能"); return true; } } else { if (e.event.clipboardData.items)//chrome for (var i = 0; i < e.event.clipboardData.items.length; i++) { if (e.event.clipboardData.items[i].kind === "file") { file = e.event.clipboardData.items[i]; break; } } if (file == null) { if (!e.event.clipboardData.getData("url") && !e.event.clipboardData.getData("text")) { alert("不能粘贴文件或图片,请使用IE11或者Chrome浏览器,或使用上传功能"); return true; } } } if (file) { if (!K.undef(self.allowImageUpload, true)) { alert("编辑器禁止上传图片,请与有关人员联系!"); return true; } //获取File Blob //debugger; var blb; if (file.getAsFile) {//Chrome blb = file.getAsFile(); if (blb.size === 0) { alert("不能获取剪切板中的" + (file.type.indexOf("image/") === 0 ? "图像" : "文件") +" 如果是从OutLook中复制的,请换其他程序,如Word"); return true; } sendfile(blb, file.type); } else { var fr = new FileReader(); if (fr.readAsArrayBuffer) {//ie fr.onloadend = function (evt) { blb = evt.target.result; sendfile(blb, file.type); } fr.readAsArrayBuffer(file); } } function sendfile(b, t) { var xhr = new XMLHttpRequest(); var formData = new FormData(); var isImg = t.indexOf("image/") === 0; //formData.append('imgFile', file,"untitled." + t.split('/')[1]); //formData.append('imgFile', b); var myBlob = new Blob([b], { "type": t }); formData.append('imgFile', myBlob, "untitled." + t.split('/')[1]); //formData.append('imgFile', b); formData.append('dir', isImg ? 'image' : 'file'); xhr.open('POST', self.uploadJson); xhr.onreadystatechange = function () { if (xhr.readyState == 4&&xhr.status == 200) { // if (fn) { var data = _trim(xhr.responseText); //if (dataType == 'json') { data = _json(data); if (data.error) { if (typeof ($) !== "undefined" && $.messager && $.messager.alert) { $.messager.alert('Error', data.message, 'warning'); } else { alert(data.message); } } else { //self.exec('insertimage', url, title, width, height, border, align); if(K.undef(self.formatUploadUrl, true)) data.url =K.formatUrl(data.url, 'absolute'); self.exec('insertimage', data.url, "from clipboard", undefined, undefined, undefined, undefined); } //} // fn(data); // } } } xhr.send(formData); } return true; } } //debugger; if (dopasteImg()) e.stop(); //处理粘贴结束5825
此代码在chrome中测试通过,上传文件的服务器端处理无须改变,本代码已在chrome v35,IE11上测试通过
其中处理的几个例外情况是:
- 在IE11和Chrome以外的浏览器中,如果复制了图片,粘贴,有可能会粘贴成<img src="data:img/png:base64:xxxxxx"..../>这种形式的,如IE10或者Firefox,但也可能会粘贴成<img src="本地路径" 这种格式前一种格式,如果通过一些复杂的处理,做成上传比较容易(或者直接不处理,但这只能显示在支持这种HTML5格式的浏览器中),但后一种情况,如从OutLook收件箱中复制的图片,本人认为处理会很复杂,所以简单起见,禁止这些情况的粘贴
- 在chrome中,如果复制了Outlook收件箱的图片,在剪切板中是找不到这个文件的内容的(file.size==0),这种情况下的粘贴也会被禁止并提示
- 在IE11和Chrome中都有FormData对象,所以当能取到文件的时候一定是IE11或者Chrome
- 如果是火狐浏览器,pasteType设置为2即可,且在引用时判断浏览器类型如为火狐。则用form-data方式进行存储。(暂时找不到更好的办法,望指教)
****************************************************************************************************************************************************************************************************************************************
以上是大神的代码,本人对其进行了小小的修改,在粘贴上传图片是显示等待窗体,关闭等待窗体时图片上传不会中断,但不会显示在编辑器中
以下是小弟的代码:
//处理IE11,Chrome粘贴图片上传 ****** start ****** function dopasteImg() { //debugger; var file = null; if (window.clipboardData) { //ie浏览器粘贴板 if (clipboardData.files && clipboardData.files.length)//IE11 file = clipboardData.files[0]; else if (!clipboardData.getData("text") && !clipboardData.getData("url")) { alert("不能粘贴本地文件或图片,请使用IE11或者Chrome浏览器,或使用菜单中上传功能"); return true; } } else { if (e.event.clipboardData.items){ //chrome浏览器粘贴板 for (var i = 0; i < e.event.clipboardData.items.length; i++) { if (e.event.clipboardData.items[i].kind === "file") { file = e.event.clipboardData.items[i]; break; } } } if (file == null) { if (!e.event.clipboardData.getData("url") && !e.event.clipboardData.getData("text")) { alert("不能粘贴本地文件或图片,请使用IE11或者Chrome浏览器,或使用菜单中上传功能"); return true; } } } if (file) { if (!K.undef(self.allowImageUpload, true)) { alert("编辑器禁止上传图片,请与有关人员联系!"); return true; } //获取File Blob //debugger; var blb; if (file.getAsFile) {//Chrome浏览器 blb = file.getAsFile(); if (blb.size === 0) { alert("不能获取剪切板中的" + (file.type.indexOf("image/") === 0 ? "图像" : "文件") +" 如果是从OutLook中复制的,请换其他程序,如Word"); return true; } sendfile(blb, file.type); } else { var fr = new FileReader(); if (fr.readAsArrayBuffer) {//ie浏览器 fr.onloadend = function (evt) { blb = evt.target.result; sendfile(blb, file.type); } fr.readAsArrayBuffer(file); } } //发送图片文件 function sendfile(b, t) { var name = 'image'; //此值可以在kindeditor.js文件中查看到,也可以结合image.js进行相关的熟悉 //创建等待窗体 var dialog = self.createDialog({ name : name, width : 400, height : 200, title : self.lang(name), body : '<div style="padding:20px;"></div>', }); dialog.showLoading(self.lang('uploadLoading')); //显示等待窗体 /* * TODO: 此处是调用url请求,要在此处增加一个等待进度条,减少用户的等待程度 * */ var tempImgName = new Date().getTime(); var xhr = new XMLHttpRequest(); var formData = new FormData(); var isImg = t.indexOf("image/") === 0; //formData.append('imgFile', file,"untitled." + t.split('/')[1]); //formData.append('imgFile', b); var myBlob = new Blob([b], { "type": t }); formData.append('imgFile', myBlob, "img_"+tempImgName+"."+ t.split('/')[1]); //formData.append('imgFile', b); formData.append('dir', isImg ? 'image' : 'file'); xhr.open('POST', self.uploadJson); xhr.onreadystatechange = function () { if (xhr.readyState == 4&&xhr.status == 200) { //当dialogs的数量小于等于0说明用户已经关闭了等待窗体,所以就不再进行添加图片 if (self.dialogs.length>0) { // Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog setTimeout(function () { self.hideDialog().focus(); }, 0); // if (fn) { var data = _trim(xhr.responseText); data = _json(data); if (data.error) { if (typeof ($) !== "undefined" && $.messager && $.messager.alert) { $.messager.alert('Error', data.message, 'warning'); } else { alert(data.message); } } else { //self.exec('insertimage', url, title, width, height, border, align); if (K.undef(self.formatUploadUrl, true)) { data.url = K.formatUrl(data.url, 'absolute'); } self.exec('insertimage', data.url, "", undefined, undefined, undefined, undefined); } } } } xhr.send(formData); } return true; } } //debugger; if (dopasteImg()){ e.stop(); } //处理粘贴结束5828 ****** end ******