六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 972|回复: 0

kindeditor编辑器添加自定义插件的方法-it论坛

[复制链接]
 楼主| 发表于 2013-12-20 18:20:24 | 显示全部楼层 |阅读模式
kindeditor编辑器添加自定义插件的方法-it论坛
 KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果。说实话在使用这个编辑器以前,我也使用过别的编辑器,最后不是因为使用麻烦,就是因为程序太臃肿,而放弃使用,可是KindEditor不同,不仅结构小巧,而且功能强大,最主要的是它采用插件的开发管理方式,能很容易再它的基础上添加插件来实现自己的功能  小编在使用KindEditor过程中,随着使用时间的加长,发现KindEditor一个最大的缺陷,那就是不支持文件的上传,所以到网上搜了很多相关的资料,发现可以自己加插件到KindEditor中,现整理方法如下:
一.打开kindeditor.js文件
  1.找到KE.lang,如下图所示:

在里面加入以下语句:
accessory : '插入附件',
invalidAccessory : "请输入有效的URL地址。只允许rar,zip格式。",




  2.在KE.setting中加入将该功能加入到kindeditor中,加入后的截图如下:



二、经过第一步后,准备工作已经作完了,下面就是编写有关上传附件的核心代码,将以下的代码加入到kindeditor.js文件中,加入到该文件的最后    })(KindEditor);之前 及上一个“;”之后即可
  1. KE.plugin['accessory'] = {
  2.      click : function (id) {
  3.          KE.util.selection(id);
  4.          this.dialog = new KE.dialog({
  5.              id : id,
  6.              cmd : 'accessory',
  7.              file : 'accessory.html',
  8.              width : 310,
  9.              height : 55,
  10.              loadingMode : true,
  11.              title : KE.lang['accessory'],
  12.              yesButton : KE.lang['yes'],
  13.              noButton: KE.lang['no']
  14.          });
  15.          this.dialog.show();
  16.      },
  17.      check: function (id) {
  18.          var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
  19.          var url = KE.$('accessoryFile', dialogDoc).value;
  20.          if (url.match(/\.(rar|zip)$/i) == null) {
  21.              alert(KE.lang['invalidAccessory']);
  22.              window.focus();
  23.              KE.g[id].yesButton.focus();
  24.              return false;
  25.          }
  26.          return true;
  27.      },
  28.      exec : function (id) {
  29.          var self = this;
  30.          var dialogDoc = KE.util.getIframeDoc(this.dialog.iframe);
  31.          if (!this.check(id)) return false;
  32.          KE.$('editorId', dialogDoc).value = id;
  33.    var uploadIframe = KE.$('uploadIframe', dialogDoc);
  34.    KE.util.showLoadingPage(id);

  35.          var onloadFunc = function() {
  36.              KE.event.remove(uploadIframe, 'load', onloadFunc);
  37.              KE.util.hideLoadingPage(id);
  38.              var uploadDoc = KE.util.getIframeDoc(uploadIframe);
  39.              var data = '';
  40.              try {
  41.                  data = KE.util.parseJson(uploadDoc.body.innerHTML);
  42.              } catch(e) { alert(KE.lang.invalidJson); }
  43.              if (typeof data === 'object' && 'error' in data) {
  44.                  if (data.error === 0) {
  45.                      self.insert(id, data.url,data.filename);
  46.                  } else {
  47.                      alert(data.message);
  48.                      return false;
  49.                  }
  50.              }
  51.          };

  52.          KE.event.add(uploadIframe, 'load', onloadFunc);
  53.          dialogDoc.uploadForm.submit();

  54.          return;
  55.      },
  56.      insert : function (id, url, filename) {
  57.          KE.util.insertHtml(id, '<a href="' + url + '" >'+filename+'</a>');
  58.          this.dialog.hide();
  59.          KE.util.focus(id);
  60.      }
  61. };
复制代码
注意最后的分号
三、在plugins文件夹中增加上传附件的文件,文件名为accessory.html,这个名字可以在以上的代码中修改(修改以上代码中的红色部分,即可)
  1. <!doctype html>
  2. <html>
  3.     <head>
  4.         <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  5.         <title>Accessory</title>
  6.         <style type="text/css">
  7.             body { font-size: 12px; margin: 0px; background: #F0F0EE; overflow: hidden; }
  8.         </style>
  9.         <script type="text/javascript">
  10.             var KE = parent.KindEditor;
  11.             location.href.match(/\?id=([\w-]+)/i);
  12.             var id = RegExp.$1;
  13.             KE.event.ready(function () { KE.util.hideLoadingPage(id); }, window, document);
  14.         </script>
  15.     </head>
  16.     <body>
  17.         <iframe name="uploadIframe" id="uploadIframe" style="display:none;"></iframe>
  18.         <form name="uploadForm" method="post" enctype="multipart/form-data" action="upload.jsp"target="uploadIframe">
  19.             <input type="hidden" id="editorId" name="id" value="" />
  20.                 <table border="0" cellpadding="0" cellspacing="0" align="center">
  21.                   <tr><td><input type="file" id="accessoryFile" name="accessoryFile" style="width:220px;" /></td></tr>
  22.                 </table>
  23.         </form>
  24.     </body>
  25. </html>
复制代码
四、编写附件上传的处理页面,这里使用jsp进行编写,以上的红色部分,即是要提交到的处理页面,这里upload.jsp和accessory.html在一个文件夹下,大家也可以放到别的文件夹下,然后改一下上面代码的action值就可以了,upload.jsp内容如下:
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ page import="java.util.*,java.io.*" %>
  3. <%@ page import="java.text.SimpleDateFormat" %>
  4. <%@ page import="org.apache.commons.fileupload.*" %>
  5. <%@ page import="org.apache.commons.fileupload.disk.*" %>
  6. <%@ page import="org.apache.commons.fileupload.servlet.*" %>
  7. <%@ page import="org.json.simple.*" %>
  8. <%

  9. //文件保存目录路径
  10. String savePath = pageContext.getServletContext().getRealPath("/") + "attached/";
  11. //文件保存目录URL
  12. String saveUrl  = request.getContextPath() + "/attached/";
  13. //定义允许上传的文件扩展名
  14. String[] fileTypes = new String[]{"rar", "zip"};
  15. //最大文件大小
  16. long maxSize = 1000000;

  17. response.setContentType("text/html; charset=UTF-8");

  18. if(!ServletFileUpload.isMultipartContent(request)){
  19. out.println(getError("请选择文件。"));
  20. return;
  21. }
  22. //检查目录
  23. File uploadDir = new File(savePath);
  24. if(!uploadDir.isDirectory()){
  25. out.println(getError("上传目录不存在。"));
  26. return;
  27. }
  28. //检查目录写权限
  29. if(!uploadDir.canWrite()){
  30. out.println(getError("上传目录没有写权限。"));
  31. return;
  32. }

  33. FileItemFactory factory = new DiskFileItemFactory();
  34. ServletFileUpload upload = new ServletFileUpload(factory);
  35. upload.setHeaderEncoding("UTF-8");
  36. List items = upload.parseRequest(request);
  37. Iterator itr = items.iterator();
  38. while (itr.hasNext()) {
  39. FileItem item = (FileItem) itr.next();
  40. String fileName = item.getName();
  41. long fileSize = item.getSize();
  42. if (!item.isFormField()) {
  43.   //检查文件大小
  44.   if(item.getSize() > maxSize){
  45.    out.println(getError("上传文件大小超过限制。"));
  46.    return;
  47.   }
  48.   //检查扩展名
  49.   String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
  50.   if(!Arrays.<String>asList(fileTypes).contains(fileExt)){
  51.    out.println(getError("上传文件扩展名是不允许的扩展名。"));
  52.    return;
  53.   }
  54.   SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
  55.   String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
  56.   try{
  57.    File uploadedFile = new File(savePath, newFileName);
  58.    item.write(uploadedFile);
  59.   }catch(Exception e){
  60.    out.println(getError("上传文件失败。"));
  61.    return;
  62.   }

  63.   JSONObject obj = new JSONObject();
  64.   obj.put("error", 0);
  65.   obj.put("url", saveUrl + newFileName);
  66.   obj.put("filename",fileName);
  67.   out.println(obj.toJSONString());
  68. }
  69. }
  70. %>
  71. <%!
  72. private String getError(String message) {
  73. JSONObject obj = new JSONObject();
  74. obj.put("error", 1);
  75. obj.put("message", message);
  76. return obj.toJSONString();
  77. }
  78. %>
复制代码
五、修改skins目录里的default.gif,增加附件图标,可采用photoshop等图片处理软件,在default.gif的最后面加一个附件图标,大小为16*16px的即可
六、修改skins目录里的default.css,加入
  1. .ke-icon-accessory
  2. {
  3.     background-position: 0px -960px;
  4.     width: 16px;
  5.     height: 16px;
  6. }
复制代码
七、测试效果如下:


八、完成
KindEditor下载
本文摘自it论坛:http://down.chinaz.com/try/201106/711_1.htm







该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表