ckeditor的浏览服务器文件功能

来源:互联网 发布:51单片机端口有感叹号 编辑:程序博客网 时间:2024/05/16 12:30

http://secyaher.blog.163.com/blog/static/389557720120195313340/


其它参考JS 抽取FCKEditor的浏览图片功能


接上篇文章,本章节讲述使用java语言的ckeditor服务器文件浏览功能。

// 虽然两篇文章的代码都带有文件类型参数,但是此处不进行判断非法格式,仅以图片类型为主介绍控件功能的开发过程。

上篇文章中,在CKEDITOR的图片选择页面,我们增加了一个浏览按钮

 

 

 

我们希望点击浏览服务器可以去服务器直接选择已经通过其他方式上传的图片,依旧很痛苦的是,我们没有那么多的银子去购买图片服务器,所以在应用中开辟了特定的区域来存放图片,并且采用分文件夹的方式。所以,浏览服务器,就涉及到多级目录的问题,我们希望如果当前的目录下存在子目录,那么可以直接进入子目录挑选图片,并且可以自由的前后操作。

先看看效果:

 

 

 

 

 

 

这样用户可以直接在界面上操作图片,进行富文本的编辑。

 

看看代码:

 

[java] view plaincopyprint?
  1. package com.normandy.position.web;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.io.PrintWriter;  
  6. import java.net.URLDecoder;  
  7. import java.net.URLEncoder;  
  8. import java.util.ArrayList;  
  9. import java.util.Iterator;  
  10. import java.util.List;  
  11.   
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15. import org.apache.commons.lang.StringUtils;  
  16. import org.apache.log4j.Logger;  
  17. import org.springframework.stereotype.Controller;  
  18. import org.springframework.ui.ModelMap;  
  19. import org.springframework.web.bind.annotation.RequestMapping;  
  20. import org.springframework.web.bind.annotation.RequestMethod;  
  21.   
  22. import com.normandy.position.common.NorStringUtils;  
  23. /** 
  24.  * 浏览服务器的图片 
  25.  * @author: quzishen 
  26.  * @class_type: FileBrowerController 
  27.  * @version: v1.0 
  28.  * @create_time:2010-8-24 下午03:54:04 
  29.  * @project_name:NormandyPosition 
  30.  * @description: 
  31.  * <p> 
  32.  *   
  33.  * </p> 
  34.  */  
  35. @Controller  
  36. @RequestMapping("/browerServer.do")  
  37. public class FileBrowerController {  
  38.     protected final Logger logger = Logger  
  39.             .getLogger(FileBrowerController.class);  
  40.     /** ~~~ 上传文件的保存路径 */  
  41.     private static final String FILE_UPLOAD_DIR = "upload";  
  42.     /** ~~~ 上传文件的保存的下一级路径,标示存储类型 */  
  43.     private static final String FILE_UPLOAD_SUB_IMG_DIR = "img";  
  44.     /** ~~~ 为了能让CKEDITOR加载到上传的图片,此处将位置限制在了freemarker下*/  
  45.     private static final String FOR_FREEMARKER_LOAD_DIR = "freemarker";  
  46.   
  47.     @RequestMapping(method = RequestMethod.GET)  
  48.     public void processBrower(ModelMap modelMap, HttpServletRequest request,  
  49.             HttpServletResponse response) {  
  50.         processBrowerPost(modelMap, request, response);  
  51.         return;  
  52.     }  
  53.   
  54.     @SuppressWarnings("deprecation")  
  55.     @RequestMapping(method = RequestMethod.POST)  
  56.     public void processBrowerPost(ModelMap modelMap,  
  57.             HttpServletRequest request, HttpServletResponse response) {  
  58.   
  59.         String typeStr = request.getParameter("type");  
  60.         String floderName = request.getParameter("fo");  
  61.           
  62.         if (logger.isDebugEnabled()) {  
  63.             logger.debug("浏览文件,文件格式:" + typeStr);  
  64.         }  
  65.   
  66.         // 定位到目标文件夹 : 上传目录   
  67.         String realPath = "";  
  68.         if(StringUtils.isNotBlank(floderName)){  
  69.             floderName = URLDecoder.decode(floderName);  
  70.             // 如果请求中存在文件夹名称,则定位到文件夹中   
  71.             realPath = request.getSession().getServletContext().getRealPath(floderName);  
  72.             if(logger.isInfoEnabled()){  
  73.                 logger.info("sub floder:"+realPath);  
  74.             }  
  75.         }else if(StringUtils.equalsIgnoreCase(typeStr, "Image")){  
  76.             // 如果请求中不存在文件夹名称,则使用默认的文件夹   
  77.             realPath = request.getSession().getServletContext().getRealPath(FOR_FREEMARKER_LOAD_DIR+ File.separator+FILE_UPLOAD_DIR+ File.separator+FILE_UPLOAD_SUB_IMG_DIR);  
  78.             if(logger.isInfoEnabled()){  
  79.                 logger.info("default floder:"+realPath);  
  80.             }  
  81.         }  
  82.           
  83.         File folder = new File(realPath);  
  84.         if(!folder.exists()){  
  85.             return;  
  86.         }  
  87.           
  88.         // 存储子目录 ,路径需要从/freemarker开始   
  89.         List<String> subFolderSet = new ArrayList<String>();  
  90.         // 存储文件夹   
  91.         List<String> subFileerSet = new ArrayList<String>();  
  92.           
  93.         File[] subFiles = folder.listFiles();  
  94.         if(null != subFiles && 0 < subFiles.length){  
  95.             for(int i=0;i < subFiles.length; i++){  
  96.                 File _file = subFiles[i];  
  97.                 if(_file.isDirectory()){  
  98.                     subFolderSet.add(getDefaultFolderFromFreemarker(_file));  
  99.                 } else {  
  100.                     subFileerSet.add(NorStringUtils.getFileName(_file.getName()));  
  101.                 }  
  102.             }  
  103.         }  
  104.           
  105.         String callback = request.getParameter("CKEditorFuncNum");  
  106.         PrintWriter out;  
  107.           
  108.         response.setContentType("text/html");  
  109.         response.setCharacterEncoding("GB2312");  
  110.         try {  
  111.             out = response.getWriter();  
  112.             out.println("<mce:script type='text/javascript'><!--  
  113. ");  
  114.               
  115.             // 定义点击选择js   
  116.             out.println("function choose(obj){");  
  117.             out.println("window.opener.CKEDITOR.tools.callFunction(" + callback  
  118.                     + ",obj)");  
  119.             out.println("window.close();");  
  120.             out.println("}");  
  121.               
  122.             // 定义文件夹点击响应js   
  123.             out.println("function view(obj){window.location.href='browerServer.do?type=image&CKEditorFuncNum="+callback+"&fo='+obj;}");  
  124.             out.println("  
  125. // --></mce:script>");   
  126.               
  127.             // 这里显示一个返回顶级目录,也就是返回freemarker目录   
  128.             out.print("<div style='width:100%;float:left;word-break:break-all;' onclick =view('" + URLEncoder.encode("/freemarker/upload") + "')>");  
  129.             out.print("<span>[根目录]<span/>");  
  130.             out.print("</div>");  
  131.               
  132.             // 如果是子文件夹,显示上级目录链接   
  133.             if(StringUtils.isNotBlank(floderName) && !checkIsRoot(folder)){  
  134.                 String parent = getDefaultFolderFromFreemarker(folder.getParentFile());  
  135.                 out.print("<div style='width:100%;float:left;word-break:break-all;' onclick =view('" + URLEncoder.encode(parent) + "')>");  
  136.                 out.print("<span>[上级目录]"+parent+"<span/>");  
  137.                 out.print("</div>");  
  138.                 if(logger.isDebugEnabled()){  
  139.                     logger.debug("发现上级目录:"+ parent);  
  140.                 }  
  141.             }  
  142.               
  143.             // 如果是文件夹,则显示文件夹并且可以再次触发下级和上级目录   
  144.             if(0 < subFolderSet.size()){  
  145.                 Iterator<String> subFolderSetIndex = subFolderSet.iterator();  
  146.                 while(subFolderSetIndex.hasNext()){  
  147.                     String ftemp = subFolderSetIndex.next();  
  148.                     // 这里url传递的时候,文件分隔符会有问题,需要转义   
  149.                     out.print("<div style='width:100%;float:left;word-break:break-all;' onclick =view('" + URLEncoder.encode(ftemp) + "')>");  
  150.                     out.print("<span>[下级目录]"+ftemp+"</span>");  
  151.                     out.print("</div>");  
  152.                       
  153.                     if(logger.isDebugEnabled()){  
  154.                         logger.debug("添加子目录:"+ftemp);  
  155.                     }  
  156.                 }  
  157.             }  
  158.               
  159.             // 如果是文件,则点击就选择文件到控件中   
  160.             if(0 < subFileerSet.size()){  
  161.                 Iterator<String> subFileerSetIndex = subFileerSet.iterator();  
  162.                 while(subFileerSetIndex.hasNext()){  
  163.                     String ftemp = subFileerSetIndex.next();  
  164.                     String f = getDefaultFolderFromFreemarker(folder);  
  165.                     String fileUrl = f + File.separator + ftemp;  
  166.                     fileUrl = StringUtils.replace(fileUrl, "//", "/");  
  167.                       
  168.                     out.print("<div style='width:150px;height:150px;float:left;word-break:break-all;padding:5px;background:#666699;margin:5px;'>");  
  169.                     out.print("<a href="javascript:void(0)" mce_href="javascript:void(0)" onclick=choose('"+fileUrl+"')><img style='border:none;width:145px;height:145px;' src=""+fileUrl+"" mce_src=""+fileUrl+"" title='"+fileUrl+"'/></a>");  
  170.                     out.print("</div>");  
  171.                       
  172.                     if(logger.isDebugEnabled()){  
  173.                         logger.debug("添加文件:"+fileUrl);  
  174.                     }  
  175.                 }  
  176.             }  
  177.               
  178.             out.flush();  
  179.             out.close();  
  180.         } catch (IOException e) {  
  181.             e.printStackTrace();  
  182.         }  
  183.     }  
  184.       
  185.     /** 
  186.      * 从freemarker这一级开始获取文件夹路径 
  187.      * @return 
  188.      */  
  189.     private static String getDefaultFolderFromFreemarker(File folder){  
  190.         String path = folder.getPath();  
  191.         path = path.substring(path.indexOf(FOR_FREEMARKER_LOAD_DIR));  
  192.         return path;  
  193.     }  
  194.       
  195.     /** 
  196.      * 判断是否是根目录 
  197.      * @param floderName 
  198.      * @return 
  199.      */  
  200.     private static boolean checkIsRoot(File folder){  
  201.         String name = NorStringUtils.getFileName(folder.getName());  
  202.         return StringUtils.equalsIgnoreCase(name, FILE_UPLOAD_DIR);  
  203.     }  
  204. }  
package com.normandy.position.web; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.normandy.position.common.NorStringUtils; /** * 浏览服务器的图片 * @author: quzishen * @class_type: FileBrowerController * @version: v1.0 * @create_time:2010-8-24 下午03:54:04 * @project_name:NormandyPosition * @description: * <p> * * </p> */ @Controller @RequestMapping("/browerServer.do") public class FileBrowerController { protected final Logger logger = Logger .getLogger(FileBrowerController.class); /** ~~~ 上传文件的保存路径 */ private static final String FILE_UPLOAD_DIR = "upload"; /** ~~~ 上传文件的保存的下一级路径,标示存储类型 */ private static final String FILE_UPLOAD_SUB_IMG_DIR = "img"; /** ~~~ 为了能让CKEDITOR加载到上传的图片,此处将位置限制在了freemarker下*/ private static final String FOR_FREEMARKER_LOAD_DIR = "freemarker"; @RequestMapping(method = RequestMethod.GET) public void processBrower(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) { processBrowerPost(modelMap, request, response); return; } @SuppressWarnings("deprecation") @RequestMapping(method = RequestMethod.POST) public void processBrowerPost(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) { String typeStr = request.getParameter("type"); String floderName = request.getParameter("fo"); if (logger.isDebugEnabled()) { logger.debug("浏览文件,文件格式:" + typeStr); } // 定位到目标文件夹 : 上传目录 String realPath = ""; if(StringUtils.isNotBlank(floderName)){ floderName = URLDecoder.decode(floderName); // 如果请求中存在文件夹名称,则定位到文件夹中 realPath = request.getSession().getServletContext().getRealPath(floderName); if(logger.isInfoEnabled()){ logger.info("sub floder:"+realPath); } }else if(StringUtils.equalsIgnoreCase(typeStr, "Image")){ // 如果请求中不存在文件夹名称,则使用默认的文件夹 realPath = request.getSession().getServletContext().getRealPath(FOR_FREEMARKER_LOAD_DIR+ File.separator+FILE_UPLOAD_DIR+ File.separator+FILE_UPLOAD_SUB_IMG_DIR); if(logger.isInfoEnabled()){ logger.info("default floder:"+realPath); } } File folder = new File(realPath); if(!folder.exists()){ return; } // 存储子目录 ,路径需要从/freemarker开始 List<String> subFolderSet = new ArrayList<String>(); // 存储文件夹 List<String> subFileerSet = new ArrayList<String>(); File[] subFiles = folder.listFiles(); if(null != subFiles && 0 < subFiles.length){ for(int i=0;i < subFiles.length; i++){ File _file = subFiles[i]; if(_file.isDirectory()){ subFolderSet.add(getDefaultFolderFromFreemarker(_file)); } else { subFileerSet.add(NorStringUtils.getFileName(_file.getName())); } } } String callback = request.getParameter("CKEditorFuncNum"); PrintWriter out; response.setContentType("text/html"); response.setCharacterEncoding("GB2312"); try { out = response.getWriter(); out.println("<mce:script type='text/javascript'><!-- "); // 定义点击选择js out.println("function choose(obj){"); out.println("window.opener.CKEDITOR.tools.callFunction(" + callback + ",obj)"); out.println("window.close();"); out.println("}"); // 定义文件夹点击响应js out.println("function view(obj){window.location.href='browerServer.do?type=image&CKEditorFuncNum="+callback+"&fo='+obj;}"); out.println(" // --></mce:script>"); // 这里显示一个返回顶级目录,也就是返回freemarker目录 out.print("<div style='width:100%;float:left;word-break:break-all;' onclick =view('" + URLEncoder.encode("/freemarker/upload") + "')>"); out.print("<span>[根目录]<span/>"); out.print("</div>"); // 如果是子文件夹,显示上级目录链接 if(StringUtils.isNotBlank(floderName) && !checkIsRoot(folder)){ String parent = getDefaultFolderFromFreemarker(folder.getParentFile()); out.print("<div style='width:100%;float:left;word-break:break-all;' onclick =view('" + URLEncoder.encode(parent) + "')>"); out.print("<span>[上级目录]"+parent+"<span/>"); out.print("</div>"); if(logger.isDebugEnabled()){ logger.debug("发现上级目录:"+ parent); } } // 如果是文件夹,则显示文件夹并且可以再次触发下级和上级目录 if(0 < subFolderSet.size()){ Iterator<String> subFolderSetIndex = subFolderSet.iterator(); while(subFolderSetIndex.hasNext()){ String ftemp = subFolderSetIndex.next(); // 这里url传递的时候,文件分隔符会有问题,需要转义 out.print("<div style='width:100%;float:left;word-break:break-all;' onclick =view('" + URLEncoder.encode(ftemp) + "')>"); out.print("<span>[下级目录]"+ftemp+"</span>"); out.print("</div>"); if(logger.isDebugEnabled()){ logger.debug("添加子目录:"+ftemp); } } } // 如果是文件,则点击就选择文件到控件中 if(0 < subFileerSet.size()){ Iterator<String> subFileerSetIndex = subFileerSet.iterator(); while(subFileerSetIndex.hasNext()){ String ftemp = subFileerSetIndex.next(); String f = getDefaultFolderFromFreemarker(folder); String fileUrl = f + File.separator + ftemp; fileUrl = StringUtils.replace(fileUrl, "//", "/"); out.print("<div style='width:150px;height:150px;float:left;word-break:break-all;padding:5px;background:#666699;margin:5px;'>"); out.print("<a href="javascript:void(0)" mce_href="javascript:void(0)" onclick=choose('"+fileUrl+"')><img style='border:none;width:145px;height:145px;' src=""+fileUrl+"" mce_src=""+fileUrl+"" title='"+fileUrl+"'/></a>"); out.print("</div>"); if(logger.isDebugEnabled()){ logger.debug("添加文件:"+fileUrl); } } } out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 从freemarker这一级开始获取文件夹路径 * @return */ private static String getDefaultFolderFromFreemarker(File folder){ String path = folder.getPath(); path = path.substring(path.indexOf(FOR_FREEMARKER_LOAD_DIR)); return path; } /** * 判断是否是根目录 * @param floderName * @return */ private static boolean checkIsRoot(File folder){ String name = NorStringUtils.getFileName(folder.getName()); return StringUtils.equalsIgnoreCase(name, FILE_UPLOAD_DIR); } }

 

这里注意,如果你没有成功,看第一篇最后部分的部署配置介绍,很简单的事儿


原创粉丝点击