最近项目遇到一个问题,项目使用SSH框架,使用一个word在线编辑控件dsoframer在线编辑word文档,用户编辑完成后,需要调用控件的方法将word文档上传到服务器上,问题就出在这里,现象如下:
1 使用正常的页面上传附件,Struts能够正确处理:Struts将附件存储到临时目录,同时可获得指向该文件的File对象。
2 调用控件的方法上传文档,Struts处理有些问题:Struts将附件存储到临时目录,但程序无法获得指向该文件的File对象。
容易想到的有两种解决方式:
1 控件的上传方法有问题,可以从控件的上传方法着手。但是这种方式不可行,首先没有控件的源代码,其次,控件使用VC写的,即使有源代码,对于Activex控件的开发不够熟悉,时间上不允许。
2 绕过Struts对附件的处理,由我们自己处理附件的解析。这种方法基本可行,但在具体实施的过程中遇到了不小的困难。
2.1 首先是从Struts的拦截器入手,关闭掉Struts的fileupload拦截器。这又有几种方式:
a 使用预定义的basicStack拦截器栈
b 定义自己的拦截器栈
c 定义自己的拦截器,在拦截器中首先对附件进行处理
这几种方式也是在网上查到的最多的。然而,无论这几种方式中的哪几种,都无法避免Struts对附件的优先处理,这一点与直觉严重不符。可能有点地方配置有问题。按道理说应该起作用的。
2.2 写自己的过滤器或处理器,参考以下两个帖子
http://auzll.iteye.com/blog/919981
http://topic.csdn.net/u/20090514/10/ba62c761-e591-4c9e-859a-87907634ea13.html
a 定义Filter,并置于Struts的Filter之前,主要源码如下:
FilterChain chain) throws IOException, ServletException {
chain.doFilter(new StrutsRequestWrapper((HttpServletRequest) request), response);
}
org.apache.struts2.dispatcher.Dispatcher里面的wrapRequest方法,有这么个判断:
if (request instanceof StrutsRequestWrapper) {
return request;
}
b Struts2的配置文件加上如下内容:
<constant name= "struts.i18n.encoding " value= "UTF-8 " />
<constant name= "struts.multipart.saveDir " value= "/tmp " />
<constant name= "struts.objectFactory " value= "spring " />
<constant name= "struts.devMode " value= "false " />
<bean type= "org.apache.struts2.dispatcher.multipart.MultiPartRequest "
name= "myRequestParser " class= "com.cn.RequestParseWrapper"
scope= "default " optional= "true " />
<constant name= "struts.multipart.handler " value= "myRequestParser " />
public void parse(HttpServletRequest servletRequest, String saveDir)throws IOException
{
}
}
简单说一下,如果2.1的方法可行的话,那么最优雅的方式应该是2.1a; 至于2.2的方法,看着都不怎么舒服,尤其是用了以后,完全屏蔽的Struts对附件的处理,
如果其他地方还想用Struts处理附件的话,就不可能了。
目前系统采用2.2b的方式处理。
搞了将近2天,好累!
*******************************************************************************************************
下面是官网上的一个faq:http://commons.apache.org/fileupload/faq.html
But I need to parse the request myself. How can I do that?
- Struts 1 parses multipart a request as a part of the process of populating your form bean from that request. If, for some reason, you need to have full control over the multipart parsing, you can do so by configuring your action mapping without an associated form bean. (A better way of doing this, however, is to replace the default multipart handler with your own. See the Struts 1 documentation for details.)
虽然这是针对Struts1的,但标红的字体还是推荐用自己的multipart handler替换默认的,看来2.2b还是受推荐的方式。
傲轩游戏网