插件代码:
/* * * Author : zhy * Date : 2013年2月21日 * Description : 插入图片插件 * */ Ext.define('TKW.Editor.Plugin.Image', { extend: 'Ext.util.Observable', alias: 'widget.PluginImage', langTitle: '<span class="commoncss">插入图片</span>', urlSizeVars: ['width', 'height'], basePath: '', constructor: function (config) { var me = this; Ext.applyIf(me.config, config); this.config = config;//保存初始化设置 //解析设置 me.url = config.url; //请求地址 me.callParent(arguments); }, init: function (cmp) { this.cmp = cmp; //保存传入的元件 this.cmp.on('initialize', this.onInit, this);//绑定初始化事件 this.cmp.on('afterrender', this.onAfterrender, this);//绑定渲染事件 }, //鼠标放开 onEditorMouseUp: function (e) { Ext.get(e.getTarget()).select('img').each(function (el) { var w = el.getAttribute('width'), h = el.getAttribute('height'), src = el.getAttribute('src') + ' '; src = src.replace(new RegExp(this.urlSizeVars[0] + '=[0-9]{1,5}([&| ])'), this.urlSizeVars[0] + '=' + w + '$1'); src = src.replace(new RegExp(this.urlSizeVars[1] + '=[0-9]{1,5}([&| ])'), this.urlSizeVars[1] + '=' + h + '$1'); el.set({ src: src.replace(/\s+$/, "") }); }, this); }, //初始化 onInit: function (htmlEditor, eOpts) { Ext.EventManager.on(htmlEditor.getDoc(), { 'mouseup': this.onEditorMouseUp, buffer: 100, scope: this }); }, //渲染 onAfterrender: function (component, eOpts) { var editor = Ext.getCmp(component.id); var toolbar = Ext.getCmp(editor.getToolbar().id); //添加按钮 toolbar.add({ iconCls: 'Plugin_Image', handler: this.selectImage, scope: this, tip: { title: this.langTitle }, overflowText: this.langTitle }); }, //交验url isUrl: function (urlString) { regExp = /(http[s]?|ftp):\/\/[^\/\.]+?\..+\w$/i; if (urlString.match(regExp)) return true; else return false; }, //选择图片 selectImage: function () { var me = this; if (!this.imgWindow) { this.imgWindow = new Ext.Window({ title: this.langTitle, id: 'imgWindow', closeAction: 'hide', modal: true, width: 400, height: 160, layout: 'fit', items: [new Ext.TabPanel({ border: false, enableTabScroll: true, activeTab: 0, height: 160, items: [{ title: '<span class="commoncss">上传本地图片</span> ', items: [{ xtype: 'form', itemId: 'upload-img', id: 'upload-img', fileUpload: true, border: false, plain: true, bodyStyle: 'padding: 10px;', labelWidth: 60, labelAlign: 'right', items: [{ xtype: 'fileuploadfield', fieldLabel: '选择文件', name: 'imageFile', anchor: '100%', allowBlank: false, emptyText: '请选择图片(大小不能超过100KB)' }, { xtype: 'textfield', fieldLabel: '图片说明', name: 'up_name', maxLength: 100, anchor: '100%', emptyText: '简短的图片说明' }] }], buttons: [{ text: '插入', iconCls: 'acceptIcon', id: 'btnUploadInset', handler: function () { var frm = Ext.getCmp('upload-img').getForm(); if (!frm.isValid()) { return; } if (frm.isValid()) { var imageFile = frm.findField('imageFile').getValue(); var point = imageFile.lastIndexOf("."); var type = imageFile.substr(point); if (type == ".jpg" || type == ".gif" || type == ".JPG" || type == ".GIF") { } else { Ext.MessageBox.alert('提示', '只支持上传jpg和gif格式的图片文件'); return; } frm.submit({ url: me.url, waitTitle: '提示', method: 'POST', waitMsg: '正在上传文件,请稍候...', success: function (form, action) { var aUrl = action.result.aUrl; if (action.result.state == 'error') { Ext.MessageBox.alert('提示',action.result.msg); return; } var img = { Url: aUrl, Title: frm.findField('up_name').getValue() }; this.insertImage(img); }, failure: function (response) { Ext.MessageBox.alert('提示', '文件上传失败'); }, scope: this }); Ext.getCmp('imgWindow').hide(); } else { if (!frm.findField('imageFile').isValid()) { } } }, scope: this }, { text: '取消', id: 'btnUploadCancel', iconCls: 'deleteIcon', handler: function () { Ext.getCmp('imgWindow').hide(); }, scope: this }] }, { title: '<span class="commoncss">链接网络图片</span> ', items: [{ xtype: 'form', itemId: 'insert-img', id: 'insert-img', border: false, plain: true, bodyStyle: 'padding: 10px;', labelWidth: 60, labelAlign: 'right', items: [{ xtype: 'textfield', fieldLabel: '图片URL', name: 'url', anchor: '100%', allowBlank: false, emptyText: '请填入支持外链的长期有效的图片URL' }, { xtype: 'textfield', fieldLabel: '图片说明', name: 'name', maxLength: 100, anchor: '100%', emptyText: '简短的图片说明' }] }], buttons: [{ text: '插入', iconCls: 'acceptIcon', id: 'btnLinkInset', handler: function () { var frm = Ext.getCmp('insert-img').getForm(); if (frm.isValid()) { url = frm.findField('url').getValue(); if (!this.isUrl(url)) { Ext.Msg.alert('提示','URL不合法.请重新输入.格式[http://****]'); return; }; var img = { // Width : 100, // Height : 100, Url: frm.findField('url').getValue(), ID: 'id_img_9999', Title: frm.findField('name').getValue() }; this.insertImage(img); this.imgWindow.hide(); } else { if (!frm.findField('url').isValid()) { } } }, scope: this }, { text: '取消', id: 'btnLinkCancel', iconCls: 'deleteIcon', handler: function () { Ext.getCmp('imgWindow').hide(); }, scope: this }] }] })], listeners: { show: { fn: function () { var frm = Ext.getCmp('insert-img').getForm(); frm.reset(); var frm1 = Ext.getCmp('upload-img').getForm(); frm1.reset(); }, scope: this, defer: 350 } } }); this.imgWindow.show(); } else { this.imgWindow.show(); } }, //插入图片 insertImage: function (img) { this.cmp.insertAtCursor('<img src="' + img.Url + '" title="' + img.Name + '" alt="' + img.Name + '">'); } });
调用代码:
<script type="text/javascript" src="/Scripts/HtmlEditorPlugins/TKW.Editor.Plugin.Image.js"></script> <script type="text/javascript"> Ext.onReady(function () { Ext.create('Ext.container.Viewport', { layout: 'fit', renderTo: Ext.getBody(), items: [ Ext.create('Ext.form.field.HtmlEditor', { plugins: [ Ext.create('TKW.Editor.Plugin.Image', { url: '/Image/Upload' }) ] }) ] }); }); </script>
服务器接收代码:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; namespace ExtjsField.Controllers { public class ImageController : Controller { // // GET: /image/ [AcceptVerbs(HttpVerbs.Post)] public string Upload() { var file = Request.Files["imageFile"]; string fileName = DateTime.Now.ToString("yyyyMMddhhmmss") + Path.GetExtension(file.FileName); file.SaveAs(Server.MapPath("~/Upload/" + fileName));//保存到服务器磁盘路径 string returnStr = "{\"success\":true,\"aUrl\":\"/Upload/" + fileName + "\"}";//返回网络路径 return returnStr; } } }
代码运行结果:
参考文献:
http://eredg4.iteye.com/blog/1047795
http://web230531.host89.chinajsp.net/login.ered?reqCode=init