zoukankan      html  css  js  c++  java
  • 关于Struts2上传文件

    最近项目遇到一个问题,项目使用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之前,主要源码如下:

           public void doFilter(ServletRequest request, ServletResponse response,  
                FilterChain chain) throws IOException, ServletException {  
        chain.doFilter(new StrutsRequestWrapper((HttpServletRequest) request), response);  
           } 
    这里先用StrutsRequestWrapper来给他wrapper一次,这样在经过struts2的filter的时候就不会有问题了。为啥呢?可以自己看看这个类
    org.apache.struts2.dispatcher.Dispatcher里面的wrapRequest方法,有这么个判断:
        // don't wrap more than once  
        if (request instanceof StrutsRequestWrapper) {  
            return request;  
        } 

            b Struts2的配置文件加上如下内容:

    <constant   name= "struts.multipart.maxSize "   value= "1152921504606846970006 "   />
    <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   class   RequestParseWrapper   extends   JakartaMultiPartRequest   {    

        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还是受推荐的方式

    ——————————————————————————————————
    傲轩游戏网
  • 相关阅读:
    mass Framework draggable插件
    将一段数字从右到左每隔三位插入一个逗号
    Firefox 12正式发布
    各大瀑布流简析与建议
    判定是否为非负整数
    mass Framework droppable插件
    HTML 5 <video> 标签
    SQL DELETE 语句
    SQL CREATE TABLE 语句(转)
    HTML <fieldset> 标签
  • 原文地址:https://www.cnblogs.com/cuizhf/p/2665551.html
Copyright © 2011-2022 走看看