fckedirot使用 及与struts2整合图片上传问题的解决办法
2012-12-01 18:35
686 查看
fckedirot使用 及与struts2整合图片上传问题的解决办法
使用:使用的版本:
FCKeditor_2.6.3
fckeditor-java-2.4-bin
一,项目中增加以下包:(特别留意项目中原有的包是否有跟以下包有冲突,例如commons-fileupload包。我原项目中有个1.0的包,加进这个1.2的包就冲突了,困扰了我好久,一开始没留意到包冲突的问题。)
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
fckeditor-java-core-2.4.1.jar
java-core-2.4.1.jar
slf4j-api-1.5.2.jar
slf4j-simple-1.5.2.jar
imageinfo-1.9.jar
二,配置web.xml:
<servlet>
<servlet-name>Connector</servlet-name>
<servlet-class>net.fckeditor.connector.ConnectorServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Connector</servlet-name>
<url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern>
</servlet-mapping>
三,在src目录下新建fckeditor.properties文件,主要配置如下:
connector.userFilesPath=/UpLoad/res //设置上传文件路径。默认是WebRoot目录下userfiles.
connector.userActionImpl=net.fckeditor.requestcycle.impl.UserActionImpl
四,将fckeditor文件夹复制到WebRoot目录下。
五,调用页面配置:
1),引入fckeditor.js文件:<script type="text/javascript" src="http://lqmh18.blog.163.com/blog/../fckeditor/fckeditor.js"></script>
2),建立textarea标签,普通html或struts标签均可,我使用struts标签,例如:<html:textarea property="magazineModel.contentTemp" name="magazineForm" styleId="FCKeditor1"></html:textarea>
3),页面中加入以下js,用fckecitor取代textarea:如果是普通html标签,new FCKeditor("这里则写name属性")。
<script type="text/javascript">
var sBasePath = "../fckeditor/";
var oFCKeditor = new FCKeditor('FCKeditor1') ;
oFCKeditor.BasePath = sBasePath ;
oFCKeditor.ReplaceTextarea() ;
</script>
与struts2的整合: (转自:http://www.sunchis.com/html/java/struts/2011/0318/272.html)
前提是,FCKeditor已经整合到你的Web项目中,FCKeditor已经可以使用,但就是在上传图片的时候一直停住不动,如下图。如果 FCKeditor单纯地在jsp页面上显示,不会存在这样的问题。但是如果FCKeditor与Struts整合,就会出现这样的问题。造成此问题的原 因就是Struts的拦截器,在web.xml配置文件中,可以清楚的看到:
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
就是上面这个配置,Struts会拦截所以以“/”开头的URL。
关于将FCKeditor整合到Web项目中,可以参考《Java FckEditor 2.6+JSP的配置方法详解》。
在FCKeditor的配置中,FCKeditor是使用servlet来实现的,它也是通过拦截URL的机制进行工作的,FCKeditor的部分servlet配置如下:
<servlet-mapping> <servlet-name>Connector</servlet-name> <url-pattern>/fckeditor/editor/filemanager/connectors/*</url-pattern> </servlet-mapping>
现在就很明了了,struts拦截所有以“/”开头的URL,FCKeditor的servlet拦截所有以“/fckeditor/editor /filemanager/connectors/”开头的URL,当你使用FCKeditor上传图片的时候,URL中包含有“/”(指网站根目录), 优先被struts的拦截器拦截,这样上传图片的URL请求自然就不会转发到FCKeditor的servlet,所以我们上传图片也就不成功。
网上有很多解决方法,但多数是修改struts的拦截范围,如将"/*"改成"*.do"或"*.action"之类的。这不是一个好方法,因为在我的项目中,我没有使用do或action的URL扩展,这样显然不能解决我的问题,那么有没有一个更加完美的解决方法呢?
答案是肯定的。我自己定义了一个过滤器FCKFilter.java,让它继承Struts2的过滤器StrutsPrepareAndExecuteFilter,完整代码如下:
package com.olympus.sapg.smtinnovation.util.method; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter; public class FCKFilter extends StrutsPrepareAndExecuteFilter { public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; String URI = request.getRequestURI(); String[] uriArray = URI.split("/fckeditor/editor/filemanager/connectors/"); int arrayLen = uriArray.length; if (arrayLen >= 2) { chain.doFilter(req, res); }else { super.doFilter(req, res, chain); } } }
上面的代码是重写了Struts2的过滤器StrutsPrepareAndExecuteFilter中的doFilter方法,执行的原理为:
获得完整的http url地址,然后判断url地址中是否包含有FCKeditor的servlet拦截规则“/fckeditor/editor/filemanager /connectors/”,若包含,struts就不拦截该url请求,而是直接转发,交由FCKeditor的servlet来处理;若不包含,则拦 截该url请求,由struts来处理。
自定义的过滤器写完之后,要在web.xml中更改struts的拦截器类,不能再使用struts的默认拦截器类 StrutsPrepareAndExecuteFilter。但是请放心,自定义的过滤器FCKFilter继承了 StrutsPrepareAndExecuteFilter里的所有的方法,因此项目依然照常运行。
<!-- struts2 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>com.olympus.sapg.smtinnovation.util.method.FCKFilter</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.olympus.sapg.smtinnovation.action</param-value>
</init-param>
</filter>
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
OK,该方法巧妙的解决了struts2和FCKeditor整合后不能上传图片的问题,需要改动的系统配置非常少,只需自定义一个拦截器,然后改一下struts的拦截器类为自定义的拦截器类,就这么简单……
相关文章推荐
- 细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!
- Fckeditor和struts2结合使用解决不能上传图片的问题
- ueditor在struts2下图片上传出错的问题的解决办法
- yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
- yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
- 细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!
- 细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!
- fckeditor2.63 上传图片的一个问题的解决办法
- linux系统 discuz论坛 门户发布新闻的时候上传图片出现上述问题“上传失败-103”的解决办法
- megapix-image插件 使用Canvas压缩图片上传 解决手机端图片上传功能的问题
- 百度ueditor struts2图片上传问题解决方案
- ueditor整合struts2图片无法上传问题
- FckEditor使用时遇到的两个问题,未能加载xxxx和上传图片无响应的解决方法
- 解决Struts2中CKFinder上传图片等文件后没有响应(服务器上也没有)问题--某特殊情况
- Kindeditor(jsp)与SSH三大框架整合上传图片出错问题解决方案
- 开发日志:struts2使用commons.fileupload上传附件,并解决upload.parseRequest(request)为空的问题
- c# asp.net 使用kindeditor在服务器上不能显示上传图片的页面等解决办法
- 部分安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
- 在IE7/IE8 关闭窗口,上传图片无法预览,window.status无效问题解决办法
- struts2 和FCKEditor 整合 不能上传图片的问题