扩展ExtJs 4.2.1 htmleditor 添加图片功能

  做项目的时候遇到这样一个问题,因为我是用ExtJs做的后台管理框架,所以当我使用ExtJs htmleditor 控件

的时候,发现没有图片上传的功能,于是我打算在网上找找有关的文章,居然真有人写过,不过可惜的是,不支持

ExtJs 4.2.1版本,所以我再搜索,终于被我找到了,现在将代码贴出,本着开源精神,我将代码开源,最后我想

感谢一个人:

马平川,cr10210206@163.com

正是他的奉献所以才完成这个功能的,非常感谢!

Ext.ns('zc');
/**
* 获取项目根路径
* */
zc.bp = function () {
    var curWwwPath = window.document.location.href;
    var pathName = window.document.location.pathname;
    var pos = curWwwPath.indexOf(pathName);
    var localhostPath = curWwwPath.substring(0, pos);
    var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1);
    return (localhostPath + projectName);
};
/**
* 获取小星星
* */
zc.getStar = function () {
    return '<span style="color:#FF0000;">*</span>';
};
/**
* @Description	Html编辑器 插入图片控件
* @author		张川(cr10210206@163.com)
*/
Ext.define('Ext.zc.form.HtmlEditorImage', {
    extend: 'Ext.util.Observable',
    alias: 'widget.zc_form_HtmlEditorImage',
    langTitle: '插入图片',
    langIconCls: 'heditImgIcon',
    init: function (view) {
        var scope = this;
        view.on('render', function () {
            scope.onRender(view);
        });
    },

    /**
    * 添加"插入图片"按钮
    * */
    onRender: function (view) {
        var scope = this;
        view.getToolbar().add({
            iconCls: scope.langIconCls,
            tooltip: {
                title: scope.langTitle,
                width: 60
            },
            handler: function () {
                scope.showImgWindow(view);
            }
        });
    },

    /**
    * 显示"插入图片"窗体
    * */
    showImgWindow: function (view) {
        var scope = this;
        Ext.create('Ext.window.Window', {
            width: 400,
            height: 305,
            title: scope.langTitle,
            layout: 'fit',
            autoShow: true,
            modal: true,
            resizable: false,
            maximizable: false,
            constrain: true,
            plain: true,
            enableTabScroll: true,
            //bodyPadding: '1 1 1 1',
            border: false,
            items: [{
                xtype: 'tabpanel',
                enableTabScroll: true,
                bodyPadding: '1 1 1 1',
                items: [{
                    title: '上传本地图片',
                    items: [{
                        xtype: 'form',
                        layout: 'column',
                        autoScroll: true,
                        border: false,
                        defaults: {
                            columnWidth: 1,
                            labelWidth: 70,
                            labelAlign: 'right',
                            padding: '5 5 5 5',
                            allowBlank: false
                        },
                        items: [{
                            xtype: 'fileuploadfield',
                            fieldLabel: '选择文件',
                            beforeLabelTextTpl: zc.getStar(),
                            buttonText: '请选择...',
                            name: 'upload',
                            emptyText: '请选择图片',
                            blankText: '图片不能为空',
                            listeners: {
                                change: function (view, value, eOpts) {
                                    scope.uploadImgCheck(view, value);
                                }
                            }
                        }, {
                            xtype: 'fieldcontainer',
                            fieldLabel: '图片大小',
                            layout: 'hbox',
                            defaultType: 'numberfield',
                            defaults: {
                                flex: 1,
                                labelWidth: 20,
                                labelAlign: 'right',
                                allowBlank: true
                            },
                            items: [{
                                fieldLabel: '宽',
                                name: 'width',
                                minValue: 1
                            }, {
                                fieldLabel: '高',
                                name: 'height',
                                minValue: 1
                            }]
                        }, {
                            xtype: 'textfield',
                            fieldLabel: '图片说明',
                            name: 'content',
                            allowBlank: true,
                            maxLength: 100,
                            emptyText: '简短的图片说明'
                        }, {
                            columnWidth: 1,
                            xtype: 'fieldset',
                            title: '上传须知',
                            layout: {
                                type: 'table',
                                columns: 1
                            },
                            collapsible: false, //是否可折叠
                            defaultType: 'label', //默认的Form表单组件
                            items: [{
                                html: '1.上传图片不超过100KB'
                            }, {
                                html: '2.为了保证图片能正常使用,我们支持以下格式的图片上传'
                            }, {
                                html: '   jpg,jpeg,png,gif'
                            }]
                        }],
                        buttons: [{
                            text: '保存',
                            action: 'btn_save',
                            icon: '../../../Images/extjs/disk.png',
                            handler: function (btn) {
                                scope.saveUploadImg(btn, view);
                            }
                        }, {
                            text: '取消',
                            icon: '../../../Images/extjs/cross.png',
                            handler: function (btn) {
                                btn.up('window').close();
                            }
                        }]
                    }]
                }, {
                    title: '链接网络图片',
                    items: [{
                        xtype: 'form',
                        layout: 'column',
                        autoScroll: true,
                        border: false,
                        defaults: {
                            columnWidth: 1,
                            labelWidth: 70,
                            labelAlign: 'right',
                            padding: '5 5 5 5',
                            allowBlank: false
                        },
                        items: [{
                            xtype: 'textfield',
                            fieldLabel: '图片地址',
                            beforeLabelTextTpl: zc.getStar(),
                            name: 'url',
                            emptyText: '请填入支持外链的长期有效的图片URL',
                            blankText: '图片地址不能为空',
                            vtype: 'remoteUrl'
                        }, {
                            xtype: 'fieldcontainer',
                            fieldLabel: '图片大小',
                            layout: 'hbox',
                            defaultType: 'numberfield',
                            defaults: {
                                flex: 1,
                                labelWidth: 20,
                                labelAlign: 'right',
                                allowBlank: true
                            },
                            items: [{
                                fieldLabel: '宽',
                                name: 'width',
                                minValue: 1
                            }, {
                                fieldLabel: '高',
                                name: 'height',
                                minValue: 1
                            }]
                        }, {
                            xtype: 'textfield',
                            fieldLabel: '图片说明',
                            name: 'content',
                            allowBlank: true,
                            maxLength: 100,
                            emptyText: '简短的图片说明'
                        }, {
                            columnWidth: 1,
                            xtype: 'fieldset',
                            title: '上传须知',
                            layout: {
                                type: 'table',
                                columns: 1
                            },
                            collapsible: false, //是否可折叠
                            defaultType: 'label', //默认的Form表单组件
                            items: [{
                                html: '1.上传图片不超过100KB'
                            }, {
                                html: '2.为了保证图片能正常使用,我们支持以下格式的图片上传'
                            }, {
                                html: '   jpg,jpeg,png,gif'
                            }]
                        }],
                        buttons: [{
                            text: '保存',
                            action: 'btn_save',
                            icon: '../../../Images/extjs/disk.png',
                            handler: function (btn) {
                                scope.saveRemoteImg(btn, view);
                            }
                        }, {
                            text: '取消',
                            icon: '../../../Images/extjs/cross.png',
                            handler: function (btn) {
                                btn.up('window').close();
                            }
                        }]
                    }]
                }]
            }]
        });
    },

    /**
    * 上传图片验证
    **/
    uploadImgCheck: function (fileObj, fileName) {
        var scope = this;
        //图片类型验证
        if (!(scope.getImgTypeCheck(scope.getImgHZ(fileName)))) {
            Ext.MessageBox.alert('温馨提示', '上传图片类型有误');
            fileObj.reset(); //清空上传内容
            return;
        }
    },

    /**
    * 获取图片后缀(小写)
    * */
    getImgHZ: function (imgName) {
        //后缀
        var hz = '';
        //图片名称中最后一个.的位置
        var index = imgName.lastIndexOf('.');
        if (index != -1) {
            //后缀转成小写
            hz = imgName.substr(index + 1).toLowerCase();
        }
        return hz;
    },

    /**
    * 图片类型验证
    * */
    getImgTypeCheck: function (hz) {
        var typestr = 'jpg,jpeg,png,gif';
        var types = typestr.split(','); //图片类型
        for (var i = 0; i < types.length; i++) {
            if (hz == types[i]) {
                return true;
            }
        }
        return false;
    },

    /**
    * 上传图片
    * */
    saveUploadImg: function (btn, view) {
        var scope = this;
        var windowObj = btn.up('window'); //获取Window对象
        var formObj = btn.up('form'); //获取Form对象
        if (formObj.isValid()) { //验证Form表单
            formObj.form.doAction('submit', {
                url: zc.bp() + '/',
                method: 'POST',
                submitEmptyText: false,
                waitMsg: '正在上传图片,请稍候...',
                timeout: 60000, // 60s
                success: function (response, options) {
                    var result = options.result;
                    if (!result.success) {
                        Ext.MessageBox.alert('温馨提示', result.msg);
                        return;
                    }
                    scope.insertImg(view, result.data);
                    windowObj.close(); //关闭窗体
                },
                failure: function (response, options) {
                    Ext.MessageBox.alert('温馨提示', options.result.msg);
                }
            });
        }
    },

    /**
    * 保存远程的图片
    * */
    saveRemoteImg: function (btn, view) {
        var scope = this;
        var windowObj = btn.up('window'); //获取Window对象
        var formObj = btn.up('form'); //获取Form对象
        if (formObj.isValid()) {//验证Form表单
            var values = formObj.getValues(); //获取Form表单的值
            scope.insertImg(view, values);
            windowObj.close(); //关闭窗体
        }
    },

    /**
    * 插入图片
    * */
    insertImg: function (view, data) {
        var url = data.url;
        var content = data.content;
        var width = data.width;
        var height = data.height;
        var str = '<img src="' + url + '" border="0" ';
        if (content != undefined && content != null && content != '') {
            str += ' title="' + content + '" ';
        }
        if (width != undefined && width != null && width != 0) {
            str += ' width="' + width + '" ';
        }
        if (height != undefined && height != null && height != 0) {
            str += ' height="' + height + '" ';
        }
        str += ' />';
        view.insertAtCursor(str);
    }
});

  像这样引用:

 {
                xtype: 'htmleditor',
                border: true,
                id: 'context',
                plugins: [
	        	    Ext.create('Ext.zc.form.HtmlEditorImage')
	            ],
                height: 400,
                anchor: '100%'
            }

  

总结:

最后,就是将你上传的图片保存在服务器上,所以在“saveRemoteImg()”方法里的ajax提交的url

你们可以自行发挥想保存在哪,这个我就不多说了。

posted @ 2014-03-13 14:34  Seaurl  阅读(2814)  评论(8编辑  收藏  举报