JSP 页面FCK上传图片

 Fckeditor完美结合Struts21——展现Fckeditor界面


2010-04-23 09:29:56

 标签:Struts2 Fckeditor 结合  [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nileader.blog.51cto.com/1381108/303228

做如下几点说明:

1.         本文所指的FckEditor是2.6.4,所指的Struts2是2.1.6

2.         有关FckEditor的源代码分析,见:http://nileader.blog.51cto.com/1381108/301614

3.         网上很多关于FckEditor在Jsp中的配置的文章,本文也是在笔者看了传智播客的fck视频后,有所改进的完成的。但是,笔者的观点的是现在纯Jsp的网站不是很多,因此Fck和Struts2的结合更为多见。如果纯jsp的小网站,建议163的编辑器大可搞定。 http://nileader.blog.51cto.com/1381108/302744

4.           本文是作者一步一步配置的过程,并记录了作者在和Struts2过程中碰到的一些问题和解决方 法,供参考。

5.  建议和这篇文章一起看,效果更佳 http://nileader.blog.51cto.com/1381108/303234

5.       项目源代码: http://down.51cto.com/download.php?do=attachment&aid=120763&k=6b8f9716a1f697186a152ee7e03a68b3&t=1271986205

Struts2环境构建

网上关于如何构建Struts2环境的文章铺天盖地,这里不再赘述,只是提供给读者Struts2.1.6的一些jar包。

 

                                                                     

下载地址是:http://down.51cto.com/download.php?do=attachment&aid=120757&k=2adb78a2c041f917b548ff1e6a58e53c&t=1271983135

加入FckEditor

Step1、下载Fckeditor2.6.4,下载地址是:http://down.51cto.com/download.php?do=attachment&aid=120751&k=f5b36d01d190c945186ec94b138e380b&t=1271981326

Step2、解压后,把里面的fckeditor目录导入到项目的WebRoot目录下,结构如图:

    

Step3、这步相当关键。

导入fckeditor-java-core的jar包到项 目的WEB-INF/lib目录下,下载地址是:http://down.51cto.com/download.php?do=attachment&aid=120752&k=74632b54f5df3e3415f74b2a20c871e3&t=1271982128

导入以下4个文件:

    

这里先别急,说明几点:

1.         这里的commons-fileupload-1.2.1.jar已经在上面Struts2中有所导入,所以不用导入。

2.         这里的slf4j-api-1.5.8.jar和slf4j-simple-1.5.8必须保持版本一致。

 

这里的三个包的下载地址是 :

http://img1.51cto.com/attachment/201004/1381108_1271985600.rar

Step4在jsp页面中,添加如下标签声明:

  1. <%@ taglib uri="http://java.fckeditor.net" prefix="FCK"%> 

Body标签中加入你要放 置的fckeditor的位置:

  1. <FCK:editor instanceName="articleAddEditor" basePath="/fckeditor" value=" " ></FCK:editor> 

好的,现在可以看到Fckeditor的真面目了。

    

 

 

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

本文出自 51CTO.COM技术博客

 

附件下载:
   这里的三个包

 

 

 

 

 

 

Fckeditor完美结合Struts22——文件上传与重命名


2010-04-23 09:35:55

 标签:Struts2 文件上传 Fckeditor 重命名   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nileader.blog.51cto.com/1381108/303234

本文是在 http://nileader.blog.51cto.com/1381108/303228的基础上展开的。
  其它的一些关于toolbarSet的定制和字体等的配置,因为和纯jsp的方法是一样的,这里不再赘述。
  本文讲解Struts2中文件上传提示没有权限

                 上传过程中用随机数来重命名文件的方法
 
  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> 

  1. 16.  

17. </filter> 

  1. 18.  

19. <filter-mapping> 

20. <filter-name>struts2</filter-name> 

21. <!-- 任何请求均有过滤器 --> 

22. <url-pattern>/*</url-pattern> 

23. </filter-mapping> 

  1. 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> 

  1. 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 
  2. connector.userFilesPath=/image/fck     指定图片上传的位置


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

    

或者是:

 

    

出现这个问题的原因是Fckeditor的拦截ServletStruts2Servlet的冲突了。
  解决方法是修改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. 10.  
  11. 11.  

12. <filter> 

13. <filter-name>struts2</filter-name> 

14. <!-- 控制器 --> 

15. <filter-class> 

16. org.apache.struts2.dispatcher.FilterDispatcher 

17. </filter-class> 

  1. 18.  

19. </filter> 

  1. 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> 

  1. 43.  

44. <servlet-mapping> 

45. <servlet-name>Connector</servlet-name> 

46. <url-pattern> 

47. /fckeditor/editor/filemanager/connectors/* 

48. </url-pattern> 

49. </servlet-mapping> 

  1. 50.  
  2. 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位 

  1. 18.  

19. SimpleDateFormat sdf=new SimpleDateFormat("yyMMddhhmmss"); 

  1. 20.  

21. String nowDate=sdf.format(new java.util.Date()); 

22. //随机数 

  1. 23.  

24. String iRandom = Math.round(Math.random()*900 )+100 +""; 

25. //整合一个code 

26. return nowDate + btype + iRandom ; 

27. } 

28. } 

上面这个类是个随机获取编号的方法。
 
  再建立这个类
  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; 

  1. 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; 

  1. 25.  

26. import org.apache.commons.fileupload.FileItem; 

27. import org.apache.commons.fileupload.FileItemFactory; 

  1. 28.  

29. import org.apache.commons.fileupload.disk.DiskFileItemFactory; 

  1. 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; 

  1. 35.  

36. public class ConnectorServlet extends HttpServlet { 

  1. 37.  

38. private static final long serialVersionUID = -5742008970929377161L; 

  1. 39.  

40. private static final Logger logger = LoggerFactory.getLogger(ConnectorServlet.class); 

  1. 41.  

42. public void init() throws ServletException, IllegalArgumentException { 

  1. 43.  

44. String realDefaultUserFilesPath = getServletContext().getRealPath( 

  1. 45.  

46. ConnectorHandler.getDefaultUserFilesPath()); 

  1. 47.  

48. File defaultUserFilesDir = new File(realDefaultUserFilesPath); 

49. UtilsFile.checkDirAndCreate(defaultUserFilesDir); 

  1. 50.  

51. logger.info("ConnectorServlet successfully initialized!"); 

52. } 

  1. 53.  

54. public void doGet(HttpServletRequest request, HttpServletResponse response) 

55. throws ServletException, IOException { 

  1. 56.  

57. logger.debug("Entering ConnectorServlet#doGet"); 

  1. 58.  

59. response.setCharacterEncoding("UTF-8"); 

  1. 60.  

61. response.setContentType("application/xml; charset=UTF-8"); 

  1. 62.  

63. response.setHeader("Cache-Control", "no-cache"); 

  1. 64.  

65. PrintWriter out = response.getWriter(); 

  1. 66.  

67. String commandStr = request.getParameter("Command"); 

  1. 68.  

69. String typeStr = request.getParameter("Type"); 

  1. 70.  

71. String currentFolderStr = request.getParameter("CurrentFolder"); 

  1. 72.  

73. logger.debug("Parameter Command: {}", commandStr); 

  1. 74.  

75. logger.debug("Parameter Type: {}", typeStr); 

  1. 76.  

77. logger.debug("Parameter CurrentFolder: {}", currentFolderStr); 

  1. 78.  

79. XmlResponse xr; 

  1. 80.  

81. if (!RequestCycleHandler.isEnabledForFileBrowsing(request)) 

  1. 82.  

83. xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.NOT_AUTHORIZED_FOR_BROWSING); 

  1. 84.  

85. else if (!CommandHandler.isValidForGet(commandStr)) 

  1. 86.  

87. xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_COMMAND); 

  1. 88.  

89. else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr)) 

  1. 90.  

91. xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_TYPE); 

  1. 92.  

93. else if (!UtilsFile.isValidPath(currentFolderStr)) 

  1. 94.  

95. xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_CURRENT_FOLDER); 

96. else { 

  1. 97.  

98. CommandHandler command = CommandHandler.getCommand(commandStr); 

  1. 99.  
  2. ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr); 
  3.  
  4. String typePath = UtilsFile.constructServerSidePath(request, resourceType); 
  5.  
  6. String typeDirPath = getServletContext().getRealPath(typePath); 
  7.  
  8. File typeDir = new File(typeDirPath); 
  9. UtilsFile.checkDirAndCreate(typeDir); 
  10.  
  11. File currentDir = new File(typeDir, currentFolderStr); 
  12.  
  13. if (!currentDir.exists()) 
  14.  
  15. xr = new XmlResponse(XmlResponse.EN_INVALID_FOLDER_NAME); 
  16. else { 
  17.  
  18. xr = new XmlResponse(command, resourceType, currentFolderStr, UtilsResponse 
  19.  
  20. .constructResponseUrl(request, resourceType, currentFolderStr, true
  21. ConnectorHandler.isFullUrl())); 
  22.  
  23. if (command.equals(CommandHandler.GET_FOLDERS)) 
  24. xr.setFolders(currentDir); 
  25.  
  26. else if (command.equals(CommandHandler.GET_FOLDERS_AND_FILES)) 
  27. xr.setFoldersAndFiles(currentDir); 
  28.  
  29. else if (command.equals(CommandHandler.CREATE_FOLDER)) { 
  30.  
  31. String newFolderStr = UtilsFile.sanitizeFolderName(request 
  32.  
  33. .getParameter("NewFolderName")); 
  34.  
  35. logger.debug("Parameter NewFolderName: {}", newFolderStr); 
  36.  
  37. File newFolder = new File(currentDir, newFolderStr); 
  38.  
  39. int errorNumber = XmlResponse.EN_UKNOWN; 
  40.  
  41. if (newFolder.exists()) 
  42.  
  43. errorNumber = XmlResponse.EN_ALREADY_EXISTS; 
  44.  
  45. else { 
  46.  
  47. try { 
  48.  
  49. errorNumber = (newFolder.mkdir()) ? XmlResponse.EN_OK 
  50. : XmlResponse.EN_INVALID_FOLDER_NAME; 
  51.  
  52. catch (SecurityException e) { 
  53.  
  54. errorNumber = XmlResponse.EN_SECURITY_ERROR; 
  55. xr.setError(errorNumber); 
  56.  
  57. out.print(xr); 
  58. out.flush(); 
  59. out.close(); 
  60.  
  61. logger.debug("Exiting ConnectorServlet#doGet"); 
  62.  
  63. @SuppressWarnings("unchecked") 
  64.  
  65. public void doPost(HttpServletRequest request, HttpServletResponse response) 
  66. throws ServletException, IOException { 
  67.  
  68. logger.debug("Entering Connector#doPost"); 
  69.  
  70. response.setCharacterEncoding("UTF-8"); 
  71.  
  72. response.setContentType("text/html; charset=UTF-8"); 
  73.  
  74. response.setHeader("Cache-Control", "no-cache"); 
  75.  
  76. PrintWriter out = response.getWriter(); 
  77.  
  78. String commandStr = request.getParameter("Command"); 
  79.  
  80. String typeStr = request.getParameter("Type"); 
  81.  
  82. String currentFolderStr = request.getParameter("CurrentFolder"); 
  83.  
  84. logger.debug("Parameter Command: {}", commandStr); 
  85.  
  86. logger.debug("Parameter Type: {}", typeStr); 
  87.  
  88. logger.debug("Parameter CurrentFolder: {}", currentFolderStr); 
  89.  
  90. UploadResponse ur; 
  91.  
  92. // if this is a QuickUpload request, ‘commandStr‘ and ‘currentFolderStr‘ 
  93.  
  94. // are empty 
  95.  
  96. if (Utils.isEmpty(commandStr) && Utils.isEmpty(currentFolderStr)) { 
  97. commandStr = "QuickUpload"; 
  98.  
  99. currentFolderStr = "/"; 
  100.  
  101. if (!RequestCycleHandler.isEnabledForFileUpload(request)) 
  102.  
  103. ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR, nullnull
  104. Messages.NOT_AUTHORIZED_FOR_UPLOAD); 
  105. else if (!CommandHandler.isValidForPost(commandStr)) 
  106.  
  107. ur = new UploadResponse(UploadResponse.SC_ERROR, nullnull, Messages.INVALID_COMMAND); 
  108.  
  109. else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr)) 
  110.  
  111. ur = new UploadResponse(UploadResponse.SC_ERROR, nullnull, Messages.INVALID_TYPE); 
  112.  
  113. else if (!UtilsFile.isValidPath(currentFolderStr)) 
  114.  
  115. ur = UploadResponse.UR_INVALID_CURRENT_FOLDER; 
  116. else { 
  117.  
  118. ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr); 
  119.  
  120. String typePath = UtilsFile.constructServerSidePath(request, resourceType); 
  121.  
  122. String typeDirPath = getServletContext().getRealPath(typePath); 
  123.  
  124. File typeDir = new File(typeDirPath); 
  125. UtilsFile.checkDirAndCreate(typeDir); 
  126.  
  127. File currentDir = new File(typeDir, currentFolderStr); 
  128.  
  129. if (!currentDir.exists()) 
  130.  
  131. ur = UploadResponse.UR_INVALID_CURRENT_FOLDER; 
  132. else { 
  133.  
  134. String newFilename = null
  135.  
  136. FileItemFactory factory = new DiskFileItemFactory(); 
  137.  
  138. ServletFileUpload upload = new ServletFileUpload(factory); 
  139.  
  140. upload.setHeaderEncoding("UTF-8"); 
  141. try { 
  142.  
  143. List<FileItem> items = upload.parseRequest(request); 
  144.  
  145. // We upload only one file at the same time 
  146.  
  147. FileItem uplFile = items.get(0); 
  148.  
  149. String rawName = UtilsFile.sanitizeFileName(uplFile.getName()); 
  150.  
  151. String filename = FilenameUtils.getName(rawName); 
  152.  
  153. String baseName = FilenameUtils.removeExtension(filename); 
  154.  
  155. String extension = FilenameUtils.getExtension(filename); 
  156.  
  157. filename = GetCode.getNo("1104" )+"."+extension; 
  158.  
  159. if (!ExtensionsHandler.isAllowed(resourceType, extension)) 
  160.  
  161. ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION); 
  162.  
  163. else { 
  164.  
  165. // construct an unique file name 
  166.  
  167. File pathToSave = new File(currentDir, filename); 
  168. int counter = 1; 
  169.  
  170. while (pathToSave.exists()) { 
  171.  
  172. newFilename = baseName.concat("(").concat(String.valueOf(counter)) 
  173.  
  174. .concat(")").concat(".").concat(extension); 
  175.  
  176. pathToSave = new File(currentDir, newFilename); 
  177. counter++; 
  178.  
  179. if (Utils.isEmpty(newFilename)) 
  180.  
  181. ur = new UploadResponse(UploadResponse.SC_OK, UtilsResponse 
  182.  
  183. .constructResponseUrl(request, resourceType, currentFolderStr, 
  184.  
  185. true, ConnectorHandler.isFullUrl()).concat(filename)); 
  186. else 
  187.  
  188. ur = new UploadResponse(UploadResponse.SC_RENAMED, 
  189.  
  190. UtilsResponse.constructResponseUrl(request, resourceType, 
  191.  
  192. currentFolderStr, true, ConnectorHandler.isFullUrl()) 
  193.  
  194. .concat(newFilename), newFilename); 
  195.  
  196. // secure image check 
  197.  
  198. if (resourceType.equals(ResourceTypeHandler.IMAGE) 
  199.  
  200. && ConnectorHandler.isSecureImageUploads()) { 
  201.  
  202. if (UtilsFile.isImage(uplFile.getInputStream())) 
  203. uplFile.write(pathToSave); 
  204.  
  205. else { 
  206. uplFile.delete(); 
  207.  
  208. ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION); 
  209.  
  210. else 
  211. uplFile.write(pathToSave); 
  212.  
  213.  
  214. catch (Exception e) { 
  215.  
  216. ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR); 
  217.  
  218.  
  219. out.print(ur); 
  220. out.flush(); 
  221. out.close(); 
  222.  
  223. logger.debug("Exiting Connector#doPost"); 
  224.  


 

 


  目录结构为:

    


  再修改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

本文出自 51CTO.COM技术博客

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。