CKEditor3.6.4上传路径配置--java版
配置文件:
CKEDITOR.editorConfig = function( config ) { // 配置ckeditor的默认语言 config.language = 'zh-cn'; // 编辑器样式 config.skin = 'v2'; // 设置工具栏 config.toolbar_Full = [ [ 'Source', '-', 'Save', 'Preview', ], [ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-','Print', 'SpellChecker', 'Scayt' ], [ 'Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll','RemoveFormat' ], '/', [ 'Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript','Superscript' ], [ 'NumberedList', 'BulletedList', '-', 'Outdent', 'Indent' ], [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock' ], [ 'Link', 'Unlink', 'Anchor' ], [ 'Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak' ], '/', [ 'Styles', 'Format', 'Font', 'FontSize' ], [ 'TextColor', 'BGColor' ] ]; // 设置快捷键 config.keystrokes = [ [ CKEDITOR.ALT + 121, 'toolbarFocus' ], // 获取焦点 [ CKEDITOR.ALT + 122, 'elementsPathFocus' ], // 元素焦点 [ CKEDITOR.SHIFT + 121, 'contextMenu' ], // 文本菜单 [ CKEDITOR.CTRL + 90, 'undo' ],// 撤销 [ CKEDITOR.CTRL + 89, 'redo' ], // 重做 [ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90, 'redo' ], [ CKEDITOR.CTRL + 76, 'link' ],// 链接 [ CKEDITOR.CTRL + 66, 'bold' ],// 粗体 [ CKEDITOR.CTRL + 73, 'italic' ], // 斜体 [ CKEDITOR.CTRL + 85, 'underline' ], // 下划线 [ CKEDITOR.ALT + 109, 'toolbarCollapse' ] ] // 设置默认字体 config.font_defaultLabel = 'Arial'; // 设置字体种类 config.font_names = 'Arial;黑体;宋体;仿宋;GB_2312'; // 换行方式 config.enterMode = CKEDITOR.ENTER_BR; // 当输入:shift+Enter是插入的标签 config.shiftEnterMode = CKEDITOR.ENTER_BR; //请求路径: //config.baseHref = 'http://localhost:8080/ckps/'; // 配置文件上传和显示路径 config.filebrowserBrowseUrl = 'servlet/BrowerUpload'; config.filebrowserUploadUrl = 'servlet/CKEditorUpload'; config.filebrowserImageUploadUrl = 'servlet/CKEditorUpload?type=Images'; config.filebrowserFlashUploadUrl = 'servlet/CKEditorUpload?type=Flashs'; config.filebrowserImageBrowseUrl = 'servlet/BrowerUpload?type=Images'; config.filebrowserFlashBrowseUrl = 'servlet/BrowerUpload?type=Flashs'; };
java的我们用servlet来进行文件上传的实现,其实网上已经有普通用的版本了,但是,总是多少有路径的限制问题,我自己研究了一早上,终于攻克了这个让人恶心的问题。我的博客里有3篇CKEditor的配置和应用的文章,那个是从别人的博文里拷贝的。起初写了个小demo,测试了下,可以用。上传功能用的是的jsp实现。我一般这些东西都会换着路径来测试可否正常使用的。果然,我新建了文件夹,放到非根目录,就有了路径问题了,无法实现任意路径的正常上传了。然后我继续网上查资料,发现有用servlet实现的。就参考了下,果然。还是根目录可以,非根目录还是不行。细节就不多说了。我的解决方法是用的servlet,因为servlet的路径可以配置成扩展模式,可以方便非根路径的映射。下面就是代码展示了:
前端:
<body> <div style="width:671px;"> <form action="<%=path %>/UploadA" method="post"> <textarea cols="80" id="content" name="content"></textarea> <script type="text/javascript"> CKEDITOR.replace('content',{ filebrowserImageBrowseUrl : 'servlet/BrowerUpload.brower', filebrowserImageUploadUrl:'servlet/CKEditorUpload.upload'}); </script> <input type="submit" value="提交"/> </form> </div> </body>
web.xml
<servlet> <servlet-name>CKEditorUpload</servlet-name> <servlet-class>com.xxx.util.CKEditorUpload</servlet-class> </servlet> <servlet> <servlet-name>BrowerUpload</servlet-name> <servlet-class>com.xxx.util.BrowerUpload</servlet-class> </servlet> <servlet-mapping> <servlet-name>CKEditorUpload</servlet-name> <url-pattern>*.upload</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>BrowerUpload</servlet-name> <url-pattern>*.brower</url-pattern> </servlet-mapping>
后台:上传的servlet:com.xxx.util.CKEditorUpload
package com.xxx.util; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class CKEditorUpload extends HttpServlet { private static final long serialVersionUID = -7339187468470294712L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-ss"); request.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=UTF-8"); response.setHeader("Cache-Control", "no-cache"); PrintWriter out = response.getWriter(); //判断提交的请求是否包含文件 boolean isMultipart = ServletFileUpload.isMultipartContent(request); //设置上传的保存路径 String uploadDir = getServletContext().getRealPath("/upload"); if (uploadDir == null) { System.out.println("无法访问存储目录"); return; } File fUploadDir = new File(uploadDir); if(!fUploadDir.exists()) { if(!fUploadDir.mkdir()) { System.out.println("无法创建存储目录!"); return; } } Date date = new Date(); String dsr = sdf.format(date); File dirfile = new File(fUploadDir,dsr); if(!dirfile.exists()){ if(!dirfile.mkdir()){ System.out.println("无法创建存储路径"); return; } } DiskFileItemFactory factory = new DiskFileItemFactory(); //设置内存中最大存储5M,超过则保存到临时文件夹下 factory.setSizeThreshold(1024*1024*5); //设置临时文件夹地址 factory.setRepository(new File("/")); ServletFileUpload upload = new ServletFileUpload(factory); //设置最大上传的文件大小 3M upload.setSizeMax(1024*1024*3); String fileName = ""; for(int k =0;k<100;k++){ if(k==50){ continue; } } List<FileItem> items = null; try { items = upload.parseRequest(request); } catch (FileUploadException e1) { e1.printStackTrace(); } Iterator<FileItem> iter = items.iterator(); while(iter.hasNext()){ FileItem item = iter.next(); if(item.isFormField()){ System.out.println("不是上传的文件"); }else{ String[] strs = item.getName().split("\\."); fileName = sdf.format(date)+Math.random()*30+"."+strs[strs.length-1]; File nFile = new File(dirfile,fileName); try { item.write(nFile); } catch (Exception e) { e.printStackTrace(); } } } String uri = request.getRequestURI(); String fileUrl = uri.substring(0,uri.indexOf("ckp")+4)+"upload/"+dsr+"/"+fileName; //CKEditorFuncNum就是在提交上传文件的同时传递到后台的request内容,表明应该插入到编辑器中的位置 String callback = request.getParameter("CKEditorFuncNum"); out.println("<script type=\"text/javascript\">"); out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",'" + fileUrl + "',''" + ")"); out.println("</script>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
后台:浏览的servlet:com.xxx.util.BrowerUpload
package com.xxx.util; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BrowerUpload extends HttpServlet { private static final long serialVersionUID = 7132717169084340320L; public BrowerUpload() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String callback = request.getParameter("CKEditorFuncNum"); System.out.println(callback); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<script type='text/javascript'>"); out.println("function tt(obj){"); out.println("window.opener.CKEDITOR.tools.callFunction("+callback+",obj)"); out.println("window.close();"); out.println("}"); out.println("</script>"); String uploadDir = getServletContext().getRealPath("/upload"); File file = new File(uploadDir); if(!file.exists()){ file.mkdir(); } File[] files = file.listFiles(); for(File f:files){ if(f.isDirectory()){ out.print(f.getName()); File[] filesc = f.listFiles(); for(File fc: filesc){ out.print("<div onclick =tt('"+"upload/"+f.getName()+"/"+fc.getName()+"','')>"); out.print("upload/"+f.getName()+"/"+fc.getName()); out.print("</div>"); } } } out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
这样就可以了。前端代码可以写在任何路径下。只要servlet的匹配模式写正确就没有问题了。