富文本编辑器CKEditor配置及使用

注:使用CKEditor版本为js版本的CKEditor 4.8.0,所有配置均参考自CKEditor官方API:https://docs.ckeditor.com/,以及实践经验

一、快速使用

  • CKEditor官网下载js插件
    进入官网https://ckeditor.com/ckeditor-4/download/点击Release notes选择4.8.0版本点击Download.Zip下载
    备注:目前最新版本4.9.0有bug,所以用4.8.0版本
    这里写图片描述
    将下载的zip包解压后放入webapp下:
    这里写图片描述
  • 引入CKEditor的js文件
<script src="ckeditor/ckeditor.js"></script>
  • 页面中使用CKEditor
<!--在需要使用编辑器的地方插入textarea标签 -->
描述:<textarea name="description" id="description"/></textarea>
<!--将相应的控件替换成编辑器代码 -->
<script type="text/javascript">
    window.onload = function()
    {
        CKEDITOR.replace( 'description');
    };
</script>

具体示例:

<!DOCTYPE html>  
<html>  
<head lang="en">  
    <meta charset="UTF-8">  
    <title></title>  
<script src="ckeditor/ckeditor.js"></script>
<script type="text/javascript">
    window.onload = function()
    {
        CKEDITOR.replace( 'description');
    };
</script>   
</head>
<body>
    <form method="post" action="job/add">
        招聘岗位:<input type="text" name="position" id="position"/>
        招聘人数:<input type="text" name="quantity" id="quantity"/>
        学历要求:<input type="text" name="education" id="education"/>
        薪资:<input type="text" name="salary" id="salary"/>
        联系人:<input type="text" name="contact" id="contact"/>
        联系电话:<input type="text" name="telephone" id="telephone"/>
        描述:<textarea name="description" id="description"/></textarea>
        <input type="submit"/>
    </form>
</body>
</html>

引入后效果如下:
这里写图片描述

  • 后台获取编辑器的值
    后台通过获取textarea的值获取编辑器的值,springMVC取值如下:
@RequestMapping(value = "/add", method = RequestMethod.POST)
public Result add(Job job){......}

二、图片上传

  • 清空图像预览框中的文字
    这里写图片描述

    ckeditor文件夹下的config.js中添加:

config.image_previewText=' ';

添加后效果如下:
这里写图片描述

  • 配置上传图片请求地址
    ckeditor文件夹下的config.js中添加:
config.filebrowserUploadUrl="file/uploadImage";
  • 上传照片预览
    图片上传成功,在目录下也可以看到图片,至此图片上传成功。但是如何将图片发到编辑器中呢?点“确定”按钮会有以下提示。
    这里写图片描述
    到这里,要在controller中返回一段JS脚本:
out.println("<script type=\"text/javascript\">");  
out.println("window.parent.CKEDITOR.tools.callFunction(" + callback  
 + ",'" + this.request.getContextPath() + "/upload/" + fileInfo.getRename() + "','')");  
out.println("</script>");   

有了这段代码,图片上传成功后,根据这里的
“upload/” + filename
相对地址,就可以使用这个图片,直接转到“图像”页面。
这里写图片描述
点击确定后编辑器如下:
这里写图片描述

  • 上传的图片重新显示到页面
    直接将值写在标签中:
<form method="post" action="job/add">
        招聘岗位:<input type="text" name="position" id="position" value='${job.position}'/>
        招聘人数:<input type="text" name="quantity" id="quantity" value='${job.quantity}' />
        学历要求:<input type="text" name="education" id="education" value='${job.education}'/>
        薪资:<input type="text" name="salary" id="salary" value='${job.salary}'/>
        联系人:<input type="text" name="contact" id="contact" value='${job.contact}'/>
        联系电话:<input type="text" name="telephone" id="telephone" value='${job.telephone}'/>
        描述:<textarea name="description" id="description"/>${job.description}</textarea>
        <input type="submit"/>
    </form>
  • 后台上传图片代码
/**
     * 富文本编辑器图片上传
     * @param file
     * @return
     */
    @RequestMapping(value = "/uploadImage", method = RequestMethod.POST)
    public void uploadImage(@RequestParam("upload")MultipartFile[] file)
    {
        response.setCharacterEncoding("UTF-8"); 
        PrintWriter out=null; 
       // CKEditor提交的很重要的一个参数 ,回调函数的序号
        String callback = this.request.getParameter("CKEditorFuncNum");
        try { 
         out = response.getWriter(); 
        } catch (IOException e1) { 
         logger.error("response.getWriter()异常="+e1); 
         e1.printStackTrace(); 
        } 
        FileInfo fileInfo = null;
        //上传目录地址
        String uploadDir = this.session.getServletContext().getRealPath("/") + "upload/";
        //如果目录不存在,自动创建文件夹
        File dir = new File(uploadDir);
        if (!dir.exists())
        {
            dir.mkdir();
        }
        try
        {
            for (int i = 0; i < file.length; i++)
            {
                if (null != file[i])
                {
                    fileInfo=executeUpload(uploadDir, file[i]);
                    fileInfo.setId(IdGen.uuid());
                    fileInfo.setCreateDt(DateUtil.getNowDate());
                    fileInfo.setCreateBy(this.getLoginUser().getId());
                    fileInfo.setUpdateBy(this.getLoginUser().getId());
                    fileInfo.setUpdateDt(this.getLoginUser().getId());
                    fileService.add(fileInfo);
                 // 返回"图像"选项卡并显示图片  request.getContextPath()为web项目名   
                    out.println("<script type=\"text/javascript\">");  
                    out.println("window.parent.CKEDITOR.tools.callFunction(" + callback  
                            + ",'" + this.request.getContextPath() + "/upload/" + fileInfo.getRename() + "','')");  
                    out.println("</script>");   

                }
            }
        }
        catch (IOException e)
        {
            out.println("<script type=\"text/javascript\">");    
            out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",''," + "'文件上传失败!');");   
            out.println("</script>");  
        }
}

三、难点总结

  • 上传图片传到后台的参数CKEditorFuncNum为空
// CKEditor提交的很重要的一个参数 ,回调函数的序号
String callback = this.request.getParameter("CKEditorFuncNum");

将CKEditor版本由CKEditor 4.9.0换成CKEditor 4.8.0解决问题

  • 上传图片传到后台的参数MultipartFile[]为空
    添加参数注解@RequestParam(“upload”)后解决,代码如下:
public void uploadImage(@RequestParam("upload")MultipartFile[] file)
  • 保存到数据库的编辑器的内容中的图片无法在页面显示
    编辑器中的图片是上传到了应用服务器的/upload目录下,编辑器中关于图片的链接信息保存到了数据库中DESCRIPTION字段中,如下:
    这里写图片描述
    在页面上直接将值写在标签中:
<form method="post" action="job/add">
    招聘岗位:<input type="text" name="position" id="position" value='${job.position}'/>
    招聘人数:<input type="text" name="quantity" id="quantity" value='${job.quantity}' />
    学历要求:<input type="text" name="education" id="education" value='${job.education}'/>
    薪资:<input type="text" name="salary" id="salary" value='${job.salary}'/>
    联系人:<input type="text" name="contact" id="contact" value='${job.contact}'/>
    联系电话:<input type="text" name="telephone" id="telephone" value='${job.telephone}'/>
    描述:<textarea name="description" id="description"/>${job.description}</textarea>
    <input type="submit"/>
</form>
  • 16
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
RAID 2.0+是一种数据存储技术,在该技术中,与传统的RAID不同,所有硬盘都参与数据的读写和重构恢复,从而提高了数据的恢复效率和读写效率。同时,RAID 2.0+还具有相比传统RAID更低的硬盘故障率和更好的负载均衡效果。传统的RAID数据读写仅限于同一个RAID组内的硬盘,而RAID 2.0+实现了数据的均匀分布在所有硬盘上,从而降低了硬盘故障率。此外,RAID 2.0+还通过所有硬盘的参与,提高了数据的读写效率。因此,RAID 2.0+通过更高的坏盘数据恢复效率、更低的硬盘故障率和更高的数据读写效率,实现了优化的数据存储和保护。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [RAID 2.0+ 技术](https://blog.csdn.net/qq_29562409/article/details/104721266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [RAID 2.0+实现原理](https://blog.csdn.net/kalamazooo/article/details/104726626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值