天天看點

CKeditor粘貼圖檔在IE下自動上傳的研究

FCKeditor更新到3.0版本,并改名為CKeditor(Content And Knowledge),是全球最優秀的網頁線上文字編輯器之一,因其驚人的性能與可擴充性而廣泛的被運用于各大網站。相信各位都有用過。

在開發教育系統時候,很多需求需要用到富文本編輯器,我們首選也是CKeditor(國産的KindEditor也是一個不錯的選擇)。在探索教育系統時,教師是最需要考慮的使用者之一,而教師往往會有大量word文檔,往往會直接複制word内容粘貼到富文本編輯器送出内容。用過CKeditor會知道,如果word帶有圖檔,粘貼到富文本編輯器裡面是看不到圖檔的。

本文就是研究CKeditor粘貼圖檔在IE下自動上傳的功能實作。

一、粘貼圖檔内容為什麼不到圖檔?

打開CKeditor的官網示範頁面(http://ckeditor.com/demo)。打開一個word文檔,複制文檔中有圖檔和文字部分。看下圖:

CKeditor粘貼圖檔在IE下自動上傳的研究

粘貼到CKeditor編輯器裡面,卻是顯示不出圖檔,看下圖:

CKeditor粘貼圖檔在IE下自動上傳的研究

檢視CKeditor裡面的源碼可以看到,圖檔的<img>裡面的資源連結都是本地機器上的圖檔,沒有權限讀取本地的圖檔,送出後,此圖檔連結也是向本地的,不是網際網路上的圖檔,這就是永遠也看不到圖檔了:

CKeditor粘貼圖檔在IE下自動上傳的研究

二、解決方案

1.借助IE的ActiveX插件把本地圖檔轉換長BASE64碼

2.編寫CKeditor插件,取用ajax技術自動送出BASE64碼到背景,背景擷取BASE64碼後轉換成圖檔存儲在伺服器上,并傳回資料到插件并把網絡圖檔的URL替換原來的指向本地圖檔的位址。

三、實作的技術細節

ActiveX作用

ActiveX的作用,就是提供一個方法,将圖檔轉換成Base64編碼,前端JavaScript會調用此方法;ActiveX中核心方法是:

編寫CKeditor插件

此插件會檢測到粘貼動作,并判斷粘貼的内容是否存放本地圖檔,如果存在就進行處理。JavaScript調用ActiveX插件的轉換方法,把本地圖檔轉換成BASE64碼,并通過ajax送出到背景;背景傳回真實的網絡圖檔位址,插件會替換掉編輯器裡面原本地圖檔的連接配接。看代碼片斷:

/*
 * CKEDITOR plugin pasteuploadpic 1.0 released
 * SITE: http://jacken.com.cn
 * AUTHOR: Jacken(陳文光)
 * MAIL: [email protected]
 */
// 處理粘貼内容
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

繼續閱讀