ckeditor富文字編輯器上傳圖片的具體步驟
ckeditor相關配置和應用可以參考:https://blog.csdn.net/sayoko06/article/details/81450441
第一步:引入ckeditor的js
<td> <textarea name="description" id="description"/></textarea> </td> <!-- 富文字編輯器 --> <script th:src="@{/plugins/ckeditor/ckeditor.js}"></script> <script type="text/javascript"> window.onload = function(){ CKEDITOR.replace( 'description',{ filebrowserImageUploadUrl : '/xxx/uploadimg',//點選上傳檔案 uploadUrl : '/xxx/uploadimg',//貼上圖片上傳 language : 'zh-cn' }); }; </script>
我下載的ckeditor引入好之後長這個樣:
第二步:上傳圖片
此時我們點選上傳圖片或者直接截圖在文字框內進行貼上,即可觸發“xxx/uploadimg”的方法,進入到後臺Controller進行圖片的上傳。
後臺Controller的具體寫法:
注意:返回到前端一定要返回JSONObject 格式,上傳成功時具體返回資料 { "uploaded":1, "url":"圖片訪問路徑"}
,前端根據url在文字框內插入一個<img>標籤,src就是你的url地址,uploaded:1代表上傳成功
/** * 上傳文章圖片 */ @RequestMapping("/uploadimg") @ResponseBody public JSONObject uploadimg(@RequestParam("upload") MultipartFile file, HttpServletRequest request, HttpSession session, HttpServletResponse response) { JSONObject jsonObject = new JSONObject(); try { /* 上傳檔案到伺服器 ,得到返回的完整url */ String url = super.uploadFile(file); /* 動態獲取系統配置的ftp地址字首 */ String ftpurl = ftpConfig.getFileserverUrl(); url = ftpurl + url;// 字首+相對路徑拼完整url jsonObject.put("uploaded", 1); jsonObject.put("fileName", file.getName()); jsonObject.put("url", url); } catch (IOException e) { e.printStackTrace(); } return jsonObject; }
上傳成功後長這個樣:
嗯,圖的確是編輯,不要在意這些細節,上傳完成後確實也是這個樣,雙擊圖片可以進行寬高設計、url地址的修改等
很好,這個時候,問題就來了,可以點選富文字編輯器左上角的檢視 原始碼 ,發現不過是一堆html標籤嘛,相當於文字值,直接點儲存就可以了...
錯!
實際上點 儲存 ,後臺會報錯,說是你有非法字元,仔細檢視發現是有反斜槓。
就是這貨 \
那怎麼辦呢?繼續往下看
第三步:js內的上傳
最開始我直接把content丟進vue的物件(cmsArticle)裡,通過post的方式丟給後臺,後來就報錯了。除錯過程中,打印出來的資料全是正常的,沒有發現反斜槓!
在我除錯了大半天之後,發現ajax將物件傳到後臺時會做一次JSON.stringify()意思是把json轉成json字串,所以我手動把content轉成字串:
JSON.stringify(content);
再列印,發現url等資訊果然被加上了反斜槓
知道了問題就好辦了
用replace()把反斜槓替換成空
var contentJSON = JSON.stringify(content);//文章內容
contentJSON = contentJSON.replace(/\\/g,"");//格式化掉轉成json後的反斜槓。注意此處是雙反斜槓,逗號左邊沒有雙引號。鬼知道我趟了多少坑...TAT
這個時候還不能把它還給物件傳到後端,其中還有特殊字元,再將其進行加碼操作,後端接收後再解碼就好了
百度說要加碼兩次,但我的專案實際操作中加碼一次就好了~ 如果出錯請多試幾次。
//取得富文字編輯器文字
var editorIframe = document.getElementsByTagName('iframe')[0];//iframe
var editorBody = editorIframe.contentDocument.body.innerHTML;//body
vm.cmsArticle.content = editorBody;
if(editorBody == "<p><br></p>"){
layer.msg("請輸入文章內容!",{icon:0,time:2000});
return false;
}
var contentJSON = JSON.stringify(vm.cmsArticle.content);//文章內容
contentJSON = contentJSON.replace(/\\/g,"");//格式化掉轉成json後的反斜槓
/* 實際測試中發現:
* JSON.stringify()時,
* 首尾多出了雙引號,刪除之 */
contentJSON = contentJSON.substr(1);//刪除第一個字元
contentJSON = contentJSON.substr(0, contentJSON.length-1);//刪除最後一個字元
contentJSON = encodeURIComponent(contentJSON);//對特殊字元進行加碼,便於傳參
vm.cmsArticle.content = contentJSON;//替換為加碼後的文章內容
$.SaveForm({
url: '/xxx/save',
param:vm.cmsArticle,
success: function(data) {
$.currentIframe().vm.load();
}
});
第四步:Controller內的儲存
/**
* 新增
* @param cmsArticle
* @return
*/
@SysLog("新增內容管理-文章管理")
@RequestMapping(value = "/save", method = RequestMethod.POST)
public R save(@RequestBody CmsArticleEntity cmsArticle) {
try {
String content = cmsArticle.getContent();
// 對加碼過的文章內容,進行解碼
content = java.net.URLDecoder.decode(content, "UTF-8");
// 替換為解碼後的的文章內容
cmsArticle.setContent(content);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
/* 進行新增操作 */
return cmsArticleService.saveCmsArticle(cmsArticle);
}
【總結】 突然接觸到新的富文字編輯器,有些不熟悉,不知道正確的用法。出錯了只能自己慢慢摸索,不過這也是進步的過程,趟過的坑越多,經驗也變得愈加深厚。加油!