Spring Boot集成CKEditor

CKEditor is a free, Open Source HTML text editor designed to simplify website content creation.

背景

項目中需要用到富文本編輯器首量,朋友推薦用CKEditor。CKEditor可以和Spring mvc很好的集成。CKEditor與CKFinder學(xué)習--整合SpringMVC介紹的不錯窟却,內(nèi)容很詳細剖笙,可是我們用的是Spring boot,這就蛋疼了涧窒,加上CKeditor不熟悉心肪,走了一些彎路,搞了好久纠吴,參考一些前輩的文章硬鞍,加上自己的理解,終于run起來了戴已。通過這次搗鼓固该,搞明白了一件事,一步步走糖儡,一步步實現(xiàn)效果伐坏,之前看到網(wǎng)上有現(xiàn)成的,直接搞起握联,到最后灰頭土臉桦沉。

集成

1.官網(wǎng)demo

官網(wǎng)給出了幾種使用樣式每瞒,可以參考一下。Github上有源碼纯露,可以過去玩玩ckeditor-docs-samples.

這里寫圖片描述

我是參考的Article-editor剿骨,感覺這個就不錯。

2.搭建工程

Spring Boot工程先搞起來埠褪,工程目錄如下:

這里寫圖片描述

工程使用了Spring data jpa浓利,還有thymeleaf。啟動后的效果组橄。

這里寫圖片描述

頁面上的輸入框有數(shù)據(jù)荞膘,就說明天前后臺交互沒問題。

    @RequestMapping(value = "/login",method = RequestMethod.GET)
    public ModelAndView index(org.springframework.ui.Model model){
        Student student=new Student("AA","1","abcdljaldf");
        model.addAttribute("status","Hello");
        model.addAttribute("page",student);
        return new ModelAndView("/index");
    }

3.集成CKEditor

把下載后的文件夾ckeditor放到static目錄下面玉工,static是Spring Boot默認的資源路徑羽资。

參考Article-editor樣式。

這里寫圖片描述

index.html中引入ckeditor.js遵班。
<script th:src="@{/ckeditor/ckeditor.js}"></script>

config.js是默認導(dǎo)入的屠升,參考ckeditor.js

這里寫圖片描述

如果想定制樣式在config.js中就可以狭郑,另外寫一個js也可以腹暖,不過需要html中需要引入,會覆蓋掉config.js中的配置翰萨。

集成后的效果:

這里寫圖片描述

還有一種最簡單的使用方式脏答,直接在textarea的class里面添加CKEditor。只是效果沒官網(wǎng)給的好看亩鬼。
<textarea cols="80" class="ckeditor" id="editor1" name="comments" rows="10"> </textarea>

這里寫圖片描述

接下來就用這種簡潔的方式殖告。

上傳

1.上傳按鈕

默認是沒有上傳按鈕的。

這里寫圖片描述

config.js中配置config.filebrowserImageUploadUrl雳锋。

config.filebrowserImageUploadUrl= '/files/upload/image'黄绩。

/files/upload/image這個是后臺配置的@RequestMapping里面的值。

上傳tab出來了玷过。爽丹。。

這里寫圖片描述

2.代碼實現(xiàn)

1.application.properties

application.properties中配置存儲路徑和訪問URL

這里寫圖片描述

2.資源路徑配置

把本地的絕對路徑加到spring boot的靜態(tài)資源路徑里辛蚊,作為資源服務(wù)器使用粤蝎。

這里寫圖片描述

3.上傳處理

@Controller
@RequestMapping("/files")
public class FilesController {

    Logger logger = org.apache.log4j.Logger.getLogger(FilesController.class);

    @Value(value = "${ckeditor.storage.image.path}")
    private String ckeditorStorageImagePath;

    @Value(value = "${ckeditor.access.image.url}")
    private String ckeditorAccessImageUrl;

    @RequestMapping(value = "/upload/image", method = RequestMethod.POST)
    @ResponseBody
    public String uploadImage(@RequestParam("upload") MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
        String name = "";
        if (!file.isEmpty()) {
            try {
                response.setContentType("text/html; charset=UTF-8");
                response.setHeader("Cache-Control", "no-cache");
                //解決跨域問題
                //Refused to display 'http://localhost:8080/upload/mgmt/img?CKEditor=practice_content&CKEditorFuncNum=1&langCode=zh-cn' in a frame because it set 'X-Frame-Options' to 'DENY'.
                response.setHeader("X-Frame-Options", "SAMEORIGIN");
                PrintWriter out = response.getWriter();

                String fileClientName = file.getOriginalFilename();
                String pathName = ckeditorStorageImagePath + fileClientName;
                File newfile = new File(pathName);
                byte[] bytes = file.getBytes();
                BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(newfile));
                stream.write(bytes);
                stream.close();

                // 組裝返回url,以便于ckeditor定位圖片
                String fileUrl = ckeditorAccessImageUrl + File.separator + newfile.getName();

                // 將上傳的圖片的url返回給ckeditor
                String callback = request.getParameter("CKEditorFuncNum");
                String script = "<script type=\"text/javascript\">window.parent.CKEDITOR.tools.callFunction(" + callback + ", '" + fileUrl + "');</script>";

                out.println(script);
                out.flush();
                out.close();
            } catch (Exception e) {
                logger.info("You failed to upload " + name + " => " + e.getMessage());
            }
        } else {
            logger.info("You failed to upload " + name + " because the file was empty.");
        }
        return "SUCCESS";
    }
}

這里參考基于spring-boot的web應(yīng)用,ckeditor上傳文件圖片文件實現(xiàn)的。上傳也可以集成CKFinder來實現(xiàn)贤重,問題是CKFinder不是開源的軟件漾肮,對java的支持也停留在2.6.2.1谤狡,所以上傳方法自己寫一下了。

3.上傳效果

這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

本地路徑下面的圖片

這里寫圖片描述

后臺交互

頁面上能夠顯示了卧檐,怎么保存到數(shù)據(jù)庫呢墓懂?看官網(wǎng)給的解釋Saving Data

這里寫圖片描述

上面可以看出霉囚,提交到后臺的是一段html文本捕仔。來驗證一下,頁面上隨便來點文本盈罐,加點樣式榜跌,上傳個圖片。

這里寫圖片描述

傳過來的是一段文本盅粪,數(shù)據(jù)庫在保存的時候钓葫,字段的值范圍設(shè)的大一些或者直接設(shè)置字段類型為longtext

這里寫圖片描述

優(yōu)化

1.預(yù)覽優(yōu)化

預(yù)覽顯示一段英文,這個去掉好看些票顾。

ckeditor/plugins/image/dialogs/image.js础浮,把||后面的那段英文刪除。

這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

參考

基于spring-boot的web應(yīng)用奠骄,ckeditor上傳文件圖片文件

代碼示例

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豆同,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子含鳞,更是在濱河造成了極大的恐慌影锈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝉绷,死亡現(xiàn)場離奇詭異鸭廷,居然都是意外死亡,警方通過查閱死者的電腦和手機潜必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門靴姿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人磁滚,你說我怎么就攤上這事佛吓。” “怎么了垂攘?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵维雇,是天一觀的道長。 經(jīng)常有香客問我晒他,道長吱型,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任陨仅,我火速辦了婚禮津滞,結(jié)果婚禮上铝侵,老公的妹妹穿的比我還像新娘。我一直安慰自己触徐,他們只是感情好咪鲜,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撞鹉,像睡著了一般疟丙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸟雏,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天享郊,我揣著相機與錄音,去河邊找鬼孝鹊。 笑死炊琉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惶室。 我是一名探鬼主播温自,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼皇钞!你這毒婦竟也來了悼泌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤夹界,失蹤者是張志新(化名)和其女友劉穎馆里,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體可柿,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鸠踪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了复斥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片营密。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖目锭,靈堂內(nèi)的尸體忽然破棺而出评汰,到底是詐尸還是另有隱情,我是刑警寧澤痢虹,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布被去,位于F島的核電站,受9級特大地震影響奖唯,放射性物質(zhì)發(fā)生泄漏惨缆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坯墨。 院中可真熱鬧寂汇,春花似錦、人聲如沸捣染。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽液斜。三九已至,卻和暖如春叠穆,著一層夾襖步出監(jiān)牢的瞬間少漆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工硼被, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留示损,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓嚷硫,卻偏偏與公主長得像检访,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仔掸,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容