CKeditor粘贴图片在IE下自动上传的研究

72 篇文章 0 订阅
53 篇文章 0 订阅
 

FCKeditor升级到3.0版本,并改名为CKeditor(Content And Knowledge),是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站。相信各位都有用过。

在开发教育系统时候,很多需求需要用到富文本编辑器,我们首选也是CKeditor(国产的KindEditor也是一个不错的选择)。在探索教育系统时,教师是最需要考虑的用户之一,而教师往往会有大量word文档,往往会直接复制word内容粘贴到富文本编辑器提交内容。用过CKeditor会知道,如果word带有图片,粘贴到富文本编辑器里面是看不到图片的。

本文就是研究CKeditor粘贴图片在IE下自动上传的功能实现。

一、粘贴图片内容为什么不到图片?

打开CKeditor的官网演示页面(http://ckeditor.com/demo)。打开一个word文档,复制文档中有图片和文字部分。看下图:

粘贴到CKeditor编辑器里面,却是显示不出图片,看下图:

查看CKeditor里面的源码可以看到,图片的<img>里面的资源链接都是本地机器上的图片,没有权限读取本地的图片,提交后,此图片链接也是向本地的,不是互联网上的图片,这就是永远也看不到图片了:

二、解决方案

1.借助IE的ActiveX插件把本地图片转换长BASE64码

2.编写CKeditor插件,取用ajax技术自动提交BASE64码到后台,后台获取BASE64码后转换成图片存储在服务器上,并返回数据到插件并把网络图片的URL替换原来的指向本地图片的地址。

三、实现的技术细节

ActiveX作用

ActiveX的作用,就是提供一个方法,将图片转换成Base64编码,前端JavaScript会调用此方法;ActiveX中核心方法是:

public string ImageToBase64(string ImagePath);

编写CKeditor插件

此插件会检测到粘贴动作,并判断粘贴的内容是否存放本地图片,如果存在就进行处理。JavaScript调用ActiveX插件的转换方法,把本地图片转换成BASE64码,并通过ajax提交到后台;后台返回真实的网络图片地址,插件会替换掉编辑器里面原本地图片的连接。看代码片断:

/*
 * CKEDITOR plugin pasteuploadpic 1.0 released
 * SITE: http://jacken.com.cn
 * AUTHOR: Jacken(陈文光)
 * MAIL: chenjacken@gmail.com
 */
// 处理粘贴内容
var pasteService = function(evt) {
    // 所见即所得模式,其他模式就退出
    if (this.mode != 'wysiwyg')
        return;
    var data = evt.data['html'];
    // 处理html内容
    if (!data)
        return;
    // 检测本地文件地址的正则表达式
    var localImgReg = //ig;
 
    var imgArray = data.match(localImgReg);
    // 是否有本地图片URL
    if (imgArray) {
        // 上传并处理编辑器内容
        replaceEditor(uoloadPic(imgArray));
 
    }
 
  };
    if (pasteuploadpic_url) {
        // 监听事件
        editor.on('paste', pasteService, null, null,1000);
    }
/**
 * 配置处理图片上传的后台地址,如果不配置,此插件不会启用.
 *
 * @name CKEDITOR.config.pasteuploadpic_url
 * @type String
 * @default null
 * @since 1.0
 * @example config.pasteuploadpic_url='/ckeditorAction_upload.action';
 */
/**
 * 配置ActiveXObject名称
 *
 * @name CKEDITOR.config.pasteuploadpic_axo
 * @type String
 * @default 'Jacken.Word'
 * @since 1.0
 * @example config.pasteuploadpic_axo='/Jacken.Word';
 */

后台如何处理BASE64

需要编写后台程序来获取BASE64码并转换成图片,保存到服务器,获得图片的网络绝对地址,并替换原编辑器内容的图片src。

Java用sun.misc.BASE64Decoder().decodeBuffer(String str)来奖Base64图片编码转换成字节。

PHP用base64_ decoder()。

四、已完成的功能和不足之处

在IE下借助ActiveX的功能,本人已经完成了粘贴图片到CKeditor,图片会自动上传功能。

完成ActiveX的程序;

完成CKeditor插件的编写(插件式,不影响升级CKeditor);

完成JAVA的J2EE后台处理BASE64码的转换,因为老师会多次复制和粘贴同一样内容,所以图片文件的存储会一定的压力,已经完成对文件进行MD5唯一性验证,同一样图片服务器上只存在一个实体图片文件。

此实现思路可以在其他的富文本编辑器下实现,只是编写不同的编辑器插件。

不足之处

必须要在IE下起作用,且必须安装ActiveX插件并允许执行。

其他浏览器暂时不能使用此方案。

似乎只能通过复杂word里面的内容粘贴才会响应上传。用QQ等直接截图后粘贴不了…..

转自:http://www.jacken.com.cn/mylife/ckeditor-paste-pictures-in-ie-autoupload-research.html

 

本插件使用JAVA技术开发,需要配合Javascript使用,可以将网页中含有的本地图片(src为'file:///')自动上传到服务器并修改img标签的src属性为新的图片地址。典型应用场景如:配合ckEditor使用,使从WORD粘贴过来的内容中包含的本地图片自动上传到服务器。 --------------------------------------------------- 依赖环境:JDK1.7 、jQuery、ckEditor4.2、浏览器不限 --------------------------------------------------- 一般使用说明 Javascript API:   类: WordImageUploader(s_url, app_name) s_url:图片上传的服务器页面地址,为动态页面,如servlet、PHP等; app_name:当前应用的名称   在使用本插件前必须首先创建本类的对象,一个页面中最好只存在一个本对象,本类的创建方法如: var uploader = new WordImageUploader(sUrl,appName);   该类的方法有: uploadWordImagesFromCKEditor(editorInstance, pre_id) 本方法用于将CKEditor中的从WORD粘贴过来的文本中的所有本地图片自动上传到服务器,参数意义如下: editorInstance:CKEditor的实例; pre_id:图片上传到服务器后的名称的前辍,方便日后清理等维护工作,如不需要,设为'';   uploadLocalFile(localUrl, name) 本方法用于将单独本地图片上传到服务器,参数意义如下: localUrl:图片的本地URL,一般形式为:file:///xxx name:图片的名称   使用步骤:   1、引入jQuery类库; 2、引入js文件夹下的wordimage_uploader.js; 3、创建WordImageUploader对象; 4、ckEditor内容改变时调用uploadWordImagesFromCKEditor方法。 插件安装完成后应在网页状态档位置显示“监控台:欢迎使用“本地图片自动上传插件”。 --------------------------------------------------- 本插件支持所有动态网站技术,DEMO所用技术为jsp,服务器端接受上传文件的动态页面为一Servelt:WordImageUploader.java,此文件已经在DEMO中给出,其它动态网站技术请参照此文件自行实现。 --------------------------------------------------- 其它使用详情请参见DEMO源码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值