zoukankan      html  css  js  c++  java
  • kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器

    最近项目中使用了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上测试通过


    其中处理的几个例外情况是:

    1.   在IE11和Chrome以外的浏览器中,如果复制了图片,粘贴,有可能会粘贴成<img src="data:img/png:base64:xxxxxx"..../>这种形式的,如IE10或者Firefox,但也可能会粘贴成<img src="本地路径" 这种格式前一种格式,如果通过一些复杂的处理,做成上传比较容易(或者直接不处理,但这只能显示在支持这种HTML5格式的浏览器中),但后一种情况,如从OutLook收件箱中复制的图片,本人认为处理会很复杂,所以简单起见,禁止这些情况的粘贴
    2.  在chrome中,如果复制了Outlook收件箱的图片,在剪切板中是找不到这个文件的内容的(file.size==0),这种情况下的粘贴也会被禁止并提示
    3.  在IE11和Chrome中都有FormData对象,所以当能取到文件的时候一定是IE11或者Chrome
    4.  如果是火狐浏览器,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  ******
  • 相关阅读:
    MVC 5 Scaffolder + EntityFramework+UnitOfWork Pattern 代码生成工具集成Visual Studio 2013
    Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)
    asp.net MVC 5 Scaffolding多层架构代码生成向导开源项目(邀请你的参与)
    Asp.net mvc 5 CRUD代码自动生成工具- vs.net 2013 Saffolding功能扩展
    Asp.net webform scaffolding结合Generic Unit of Work & (Extensible) Repositories Framework代码生成向导
    MVC中的默认Model绑定者DefaultModelBinder
    MVC中Action参数绑定的过程
    MVC中Action的执行过程
    MVC的控制器的激活过程,我们从MvcHandler开始讲,前面的事情以后再讲
    d
  • 原文地址:https://www.cnblogs.com/wind-wang/p/7222437.html
Copyright © 2011-2022 走看看