Step1.   要上传文件,首先要配置  Web.xml
配置如下:

 

 
  
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2.  
  3. <web-app version="2.4" 
  4. xmlns="http://java.sun.com/xml/ns/j2ee" 
  5.  
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  7. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  8. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
  9.  
  10. <filter> 
  11. <filter-name>struts2</filter-name> 
  12. <!-- 控制器 --> 
  13. <filter-class> 
  14. org.apache.struts2.dispatcher.FilterDispatcher 
  15. </filter-class> 
  16.  
  17. </filter> 
  18.  
  19. <filter-mapping> 
  20. <filter-name>struts2</filter-name> 
  21. <!-- 任何请求均有过滤器 --> 
  22. <url-pattern>/*</url-pattern> 
  23. </filter-mapping> 
  24.  
  25. <servlet> 
  26. <servlet-name>Connector</servlet-name> 
  27. <servlet-class> 
  28. net.fckeditor.connector.ConnectorServlet 
  29. </servlet-class> 
  30. <load-on-startup>1</load-on-startup> 
  31. </servlet> 
  32.  
  33. <servlet-mapping> 
  34. <servlet-name>Connector</servlet-name> 
  35. <url-pattern> 
  36. /fckeditor/editor/filemanager/connectors/* 
  37. </url-pattern> 
  38. </servlet-mapping> 
  39. </web-app> 


Step2. 在src目录下新建一个fckeditor.properties文件,内容如下:

 
  
  1. connector.userActionImpl =net.fckeditor.requestcycle.impl.UserActionImpl 



好了,现在可以去页面上看看了,不过出错了:

或者是:

 

出现这个问题的原因是Fckeditor的拦截Servlet和Struts2的Servlet的冲突了。
解决方法是修改web.xml如下

 

 
  
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2.  
  3. <web-app version="2.4" 
  4. xmlns="http://java.sun.com/xml/ns/j2ee" 
  5.  
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  7. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  8. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
  9.  
  10.  
  11.  
  12. <filter> 
  13. <filter-name>struts2</filter-name> 
  14. <!-- 控制器 --> 
  15. <filter-class> 
  16. org.apache.struts2.dispatcher.FilterDispatcher 
  17. </filter-class> 
  18.  
  19. </filter> 
  20.  
  21. <filter-mapping> 
  22. <filter-name>struts2</filter-name> 
  23. <url-pattern>*.action</url-pattern> 
  24. </filter-mapping> 
  25. <filter-mapping> 
  26. <filter-name>struts2</filter-name> 
  27. <url-pattern>*.jsp</url-pattern> 
  28. </filter-mapping> 
  29. <filter-mapping> 
  30. <filter-name>struts2</filter-name> 
  31. <url-pattern>/struts/*</url-pattern> 
  32. </filter-mapping> 
  33. <welcome-file-list> 
  34. <welcome-file>default.jsp</welcome-file> 
  35. </welcome-file-list> 
  36. <servlet> 
  37. <servlet-name>Connector</servlet-name> 
  38. <servlet-class> 
  39. net.fckeditor.connector.ConnectorServlet 
  40. </servlet-class> 
  41. <load-on-startup>1</load-on-startup> 
  42. </servlet> 
  43.  
  44. <servlet-mapping> 
  45. <servlet-name>Connector</servlet-name> 
  46. <url-pattern> 
  47. /fckeditor/editor/filemanager/connectors/* 
  48. </url-pattern> 
  49. </servlet-mapping> 
  50.  
  51.  
  52. </web-app> 

使得Struts2的拦截器只拦截.jsp和.action的请求。

现在再到页面上去看看,可以上传了。

Step3.  改成随机数命名文件。


        由于fckeditor的文件上传功能主要是由web.xml中配置的 net.fckeditor.connector.ConnectorServlet这个类拦截的,所以我们要自己来重命名文件的话,就要修改这个类。
        办法是在net.fckeditor.connector.ConnectorServlet的基础上,建立自己的Servlet。

在项目src目录下建立以下包
cn.nileader.tool
里面建立两个类:

GetCode.java

 

 

 
  
  1. package com.rctraffic110.tool; 
  2.  
  3. import java.text.SimpleDateFormat; 
  4.  
  5. public class GetCode { 
  6.  
  7. /* 
  8. * 获取一个记录编号 
  9. * 格式:12 位时间+业务编号+随即数 
  10. * 例如:100330101028+04+893 (2010-03-30-10:20:28, 业务号是04, 随机数893 ) 
  11. *@param btype 业务类型编号 员工业务01 招聘业务02…… 
  12. *@return code 构造的一个记录编号 
  13. */ 
  14. public static String getNo(String btype){ 
  15. //返回的code 
  16. String code; 
  17. //系统当前时间 12位 
  18.  
  19. SimpleDateFormat sdf=new SimpleDateFormat("yyMMddhhmmss"); 
  20.  
  21. String nowDate=sdf.format(new java.util.Date()); 
  22. //随机数 
  23.  
  24. String iRandom = Math.round(Math.random()*900 )+100 +""; 
  25. //整合一个code 
  26. return nowDate + btype + iRandom ; 

上面这个类是个随机获取编号的方法。

再建立这个类
ConcectorServlet.java
 

 
  
  1. package com.rctraffic110.tool; 
  2.  
  3.  
  4. import java.io.File; 
  5. import java.io.IOException; 
  6. import java.io.PrintWriter; 
  7. import java.util.List; 
  8.  
  9. import javax.servlet.ServletException; 
  10. import javax.servlet.http.HttpServlet; 
  11. import javax.servlet.http.HttpServletRequest; 
  12. import javax.servlet.http.HttpServletResponse; 
  13.  
  14. import net.fckeditor.connector.Messages; 
  15. import net.fckeditor.handlers.CommandHandler; 
  16. import net.fckeditor.handlers.ConnectorHandler; 
  17. import net.fckeditor.handlers.ExtensionsHandler; 
  18. import net.fckeditor.handlers.RequestCycleHandler; 
  19. import net.fckeditor.handlers.ResourceTypeHandler; 
  20. import net.fckeditor.response.UploadResponse; 
  21. import net.fckeditor.response.XmlResponse; 
  22. import net.fckeditor.tool.Utils; 
  23. import net.fckeditor.tool.UtilsFile; 
  24. import net.fckeditor.tool.UtilsResponse; 
  25.  
  26. import org.apache.commons.fileupload.FileItem; 
  27. import org.apache.commons.fileupload.FileItemFactory; 
  28.  
  29. import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
  30.  
  31. import org.apache.commons.fileupload.servlet.ServletFileUpload; 
  32. import org.apache.commons.io.FilenameUtils; 
  33. import org.slf4j.Logger; 
  34. import org.slf4j.LoggerFactory; 
  35.  
  36. public class ConnectorServlet extends HttpServlet { 
  37.  
  38. private static final long serialVersionUID = -5742008970929377161L; 
  39.  
  40. private static final Logger logger = LoggerFactory.getLogger(ConnectorServlet.class); 
  41.  
  42. public void init() throws ServletException, IllegalArgumentException { 
  43.  
  44. String realDefaultUserFilesPath = getServletContext().getRealPath( 
  45.  
  46. ConnectorHandler.getDefaultUserFilesPath()); 
  47.  
  48. File defaultUserFilesDir = new File(realDefaultUserFilesPath); 
  49. UtilsFile.checkDirAndCreate(defaultUserFilesDir); 
  50.  
  51. logger.info("ConnectorServlet successfully initialized!"); 
  52.  
  53. public void doGet(HttpServletRequest request, HttpServletResponse response) 
  54. throws ServletException, IOException { 
  55.  
  56. logger.debug("Entering ConnectorServlet#doGet"); 
  57.  
  58. response.setCharacterEncoding("UTF-8"); 
  59.  
  60. response.setContentType("application/xml; charset=UTF-8"); 
  61.  
  62. response.setHeader("Cache-Control""no-cache"); 
  63.  
  64. PrintWriter out = response.getWriter(); 
  65.  
  66. String commandStr = request.getParameter("Command"); 
  67.  
  68. String typeStr = request.getParameter("Type"); 
  69.  
  70. String currentFolderStr = request.getParameter("CurrentFolder"); 
  71.  
  72. logger.debug("Parameter Command: {}", commandStr); 
  73.  
  74. logger.debug("Parameter Type: {}", typeStr); 
  75.  
  76. logger.debug("Parameter CurrentFolder: {}", currentFolderStr); 
  77.  
  78. XmlResponse xr; 
  79.  
  80. if (!RequestCycleHandler.isEnabledForFileBrowsing(request)) 
  81.  
  82. xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.NOT_AUTHORIZED_FOR_BROWSING); 
  83.  
  84. else if (!CommandHandler.isValidForGet(commandStr)) 
  85.  
  86. xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_COMMAND); 
  87.  
  88. else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr)) 
  89.  
  90. xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_TYPE); 
  91.  
  92. else if (!UtilsFile.isValidPath(currentFolderStr)) 
  93.  
  94. xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_CURRENT_FOLDER); 
  95. else { 
  96.  
  97. CommandHandler command = CommandHandler.getCommand(commandStr); 
  98.  
  99. ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr); 
  100.  
  101. String typePath = UtilsFile.constructServerSidePath(request, resourceType); 
  102.  
  103. String typeDirPath = getServletContext().getRealPath(typePath); 
  104.  
  105. File typeDir = new File(typeDirPath); 
  106. UtilsFile.checkDirAndCreate(typeDir); 
  107.  
  108. File currentDir = new File(typeDir, currentFolderStr); 
  109.  
  110. if (!currentDir.exists()) 
  111.  
  112. xr = new XmlResponse(XmlResponse.EN_INVALID_FOLDER_NAME); 
  113. else { 
  114.  
  115. xr = new XmlResponse(command, resourceType, currentFolderStr, UtilsResponse 
  116.  
  117. .constructResponseUrl(request, resourceType, currentFolderStr, true
  118. ConnectorHandler.isFullUrl())); 
  119.  
  120. if (command.equals(CommandHandler.GET_FOLDERS)) 
  121. xr.setFolders(currentDir); 
  122.  
  123. else if (command.equals(CommandHandler.GET_FOLDERS_AND_FILES)) 
  124. xr.setFoldersAndFiles(currentDir); 
  125.  
  126. else if (command.equals(CommandHandler.CREATE_FOLDER)) { 
  127.  
  128. String newFolderStr = UtilsFile.sanitizeFolderName(request 
  129.  
  130. .getParameter("NewFolderName")); 
  131.  
  132. logger.debug("Parameter NewFolderName: {}", newFolderStr); 
  133.  
  134. File newFolder = new File(currentDir, newFolderStr); 
  135.  
  136. int errorNumber = XmlResponse.EN_UKNOWN; 
  137.  
  138. if (newFolder.exists()) 
  139.  
  140. errorNumber = XmlResponse.EN_ALREADY_EXISTS; 
  141.  
  142. else { 
  143.  
  144. try { 
  145.  
  146. errorNumber = (newFolder.mkdir()) ? XmlResponse.EN_OK 
  147. : XmlResponse.EN_INVALID_FOLDER_NAME; 
  148.  
  149. catch (SecurityException e) { 
  150.  
  151. errorNumber = XmlResponse.EN_SECURITY_ERROR; 
  152. xr.setError(errorNumber); 
  153.  
  154. out.print(xr); 
  155. out.flush(); 
  156. out.close(); 
  157.  
  158. logger.debug("Exiting ConnectorServlet#doGet"); 
  159.  
  160. @SuppressWarnings("unchecked"
  161.  
  162. public void doPost(HttpServletRequest request, HttpServletResponse response) 
  163. throws ServletException, IOException { 
  164.  
  165. logger.debug("Entering Connector#doPost"); 
  166.  
  167. response.setCharacterEncoding("UTF-8"); 
  168.  
  169. response.setContentType("text/html; charset=UTF-8"); 
  170.  
  171. response.setHeader("Cache-Control""no-cache"); 
  172.  
  173. PrintWriter out = response.getWriter(); 
  174.  
  175. String commandStr = request.getParameter("Command"); 
  176.  
  177. String typeStr = request.getParameter("Type"); 
  178.  
  179. String currentFolderStr = request.getParameter("CurrentFolder"); 
  180.  
  181. logger.debug("Parameter Command: {}", commandStr); 
  182.  
  183. logger.debug("Parameter Type: {}", typeStr); 
  184.  
  185. logger.debug("Parameter CurrentFolder: {}", currentFolderStr); 
  186.  
  187. UploadResponse ur; 
  188.  
  189. // if this is a QuickUpload request, 'commandStr' and 'currentFolderStr' 
  190.  
  191. // are empty 
  192.  
  193. if (Utils.isEmpty(commandStr) && Utils.isEmpty(currentFolderStr)) { 
  194. commandStr = "QuickUpload"
  195.  
  196. currentFolderStr = "/"
  197.  
  198. if (!RequestCycleHandler.isEnabledForFileUpload(request)) 
  199.  
  200. ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR, nullnull
  201. Messages.NOT_AUTHORIZED_FOR_UPLOAD); 
  202. else if (!CommandHandler.isValidForPost(commandStr)) 
  203.  
  204. ur = new UploadResponse(UploadResponse.SC_ERROR, nullnull, Messages.INVALID_COMMAND); 
  205.  
  206. else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr)) 
  207.  
  208. ur = new UploadResponse(UploadResponse.SC_ERROR, nullnull, Messages.INVALID_TYPE); 
  209.  
  210. else if (!UtilsFile.isValidPath(currentFolderStr)) 
  211.  
  212. ur = UploadResponse.UR_INVALID_CURRENT_FOLDER; 
  213. else { 
  214.  
  215. ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr); 
  216.  
  217. String typePath = UtilsFile.constructServerSidePath(request, resourceType); 
  218.  
  219. String typeDirPath = getServletContext().getRealPath(typePath); 
  220.  
  221. File typeDir = new File(typeDirPath); 
  222. UtilsFile.checkDirAndCreate(typeDir); 
  223.  
  224. File currentDir = new File(typeDir, currentFolderStr); 
  225.  
  226. if (!currentDir.exists()) 
  227.  
  228. ur = UploadResponse.UR_INVALID_CURRENT_FOLDER; 
  229. else { 
  230.  
  231. String newFilename = null
  232.  
  233. FileItemFactory factory = new DiskFileItemFactory(); 
  234.  
  235. ServletFileUpload upload = new ServletFileUpload(factory); 
  236.  
  237. upload.setHeaderEncoding("UTF-8"); 
  238. try { 
  239.  
  240. List<FileItem> items = upload.parseRequest(request); 
  241.  
  242. // We upload only one file at the same time 
  243.  
  244. FileItem uplFile = items.get(0); 
  245.  
  246. String rawName = UtilsFile.sanitizeFileName(uplFile.getName()); 
  247.  
  248. String filename = FilenameUtils.getName(rawName); 
  249.  
  250. String baseName = FilenameUtils.removeExtension(filename); 
  251.  
  252. String extension = FilenameUtils.getExtension(filename); 
  253.  
  254. filename = GetCode.getNo("1104" )+"."+extension; 
  255.  
  256. if (!ExtensionsHandler.isAllowed(resourceType, extension)) 
  257.  
  258. ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION); 
  259.  
  260. else { 
  261.  
  262. // construct an unique file name 
  263.  
  264. File pathToSave = new File(currentDir, filename); 
  265. int counter = 1
  266.  
  267. while (pathToSave.exists()) { 
  268.  
  269. newFilename = baseName.concat("(").concat(String.valueOf(counter)) 
  270.  
  271. .concat(")").concat(".").concat(extension); 
  272.  
  273. pathToSave = new File(currentDir, newFilename); 
  274. counter++; 
  275.  
  276. if (Utils.isEmpty(newFilename)) 
  277.  
  278. ur = new UploadResponse(UploadResponse.SC_OK, UtilsResponse 
  279.  
  280. .constructResponseUrl(request, resourceType, currentFolderStr, 
  281.  
  282. true, ConnectorHandler.isFullUrl()).concat(filename)); 
  283. else 
  284.  
  285. ur = new UploadResponse(UploadResponse.SC_RENAMED, 
  286.  
  287. UtilsResponse.constructResponseUrl(request, resourceType, 
  288.  
  289. currentFolderStr, true, ConnectorHandler.isFullUrl()) 
  290.  
  291. .concat(newFilename), newFilename); 
  292.  
  293. // secure p_w_picpath check 
  294.  
  295. if (resourceType.equals(ResourceTypeHandler.IMAGE) 
  296.  
  297. && ConnectorHandler.isSecureImageUploads()) { 
  298.  
  299. if (UtilsFile.isImage(uplFile.getInputStream())) 
  300. uplFile.write(pathToSave); 
  301.  
  302. else { 
  303. uplFile.delete(); 
  304.  
  305. ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION); 
  306.  
  307. else 
  308. uplFile.write(pathToSave); 
  309.  
  310.  
  311. catch (Exception e) { 
  312.  
  313. ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR); 
  314.  
  315.  
  316. out.print(ur); 
  317. out.flush(); 
  318. out.close(); 
  319.  
  320. logger.debug("Exiting Connector#doPost"); 
  321.  


目录结构为:


再修改web.xml中的Servlet如下:

 
  
  1. <servlet> 
  2. <servlet-name>Connector</servlet-name> 
  3. <servlet-class> 
  4. cn.nileader.tool.ConnectorServlet 
  5. </servlet-class> 
  6. <load-on-startup>1</load-on-startup> 
  7. </servlet> 



效果如下:

 

 

本文出自 “ni掌柜在路上” 博客,请务必保留此出处http://nileader.blog.51cto.com/1381108/303234