本来上传也是要弄进度条,参照网上弄了下,我的项目action是调用别人提供的方法,貌似实现不了,也没深究,直接弄个了遮罩层提示上传,弄个gif在那一直转-。-,不是非要实现进度条可以考虑用遮罩层,坐等会的大神回答。

解决方案 »

  1.   

    这个问题之前就有人问过回答了不下三次了struts2自身就有MultiPartRequest的实现。楼主到官网把struts2的对应版本的源码下载下来。找到struts2-core.jar的org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类的代码。自己写个类实现MultiPartRequest或者继承org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest把org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest的代码copy进来主要的监听部分就在//这里面就是解析上传文件的核心代码
     private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
        DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
        ServletFileUpload upload = new ServletFileUpload(fac);
        upload.setSizeMax(this.maxSize);
    /*注册上传进度监听器这里面你就可以记录进度到session中,你前台再用setInterval到另一个action中取session的进度就可以了*/
        upload.setProgressListener(new ProgressListener(){
    /*第一个参数代表当前已读了多少字节,第二个参数代表整个表单的长度也可以当做文件的总大小,第三个参数是代表已解析到第几个(这里对你不重要)*/
          public void update(long readBytes, long contentLength, int items){
            HttpSession session=ServletActionContext.getRequest().getSession();
            session.setAttribute("currentProgress",readBytes);
            session.setAttribute("contentLength",contentLength);
          }
        });
        return upload.parseRequest(createRequestContext(servletRequest));
      }前台在用一个setInterval来请求另一个action那个action就从session里取进度就是了。前台的进度条显示可以用jquery的progressbar.js
      

  2.   

    恩,我只是专门写了个类FileUploadListener实现了ProgressListener接口,在parseRequest方法里面是这样的FileUploadListener progressListener = new FileUploadListener(
    servletRequest);
    upload.setProgressListener(progressListener);
    每次上传能够执行FileUploadListener的构造方法,但是过后就没反应了,update方法没执行哦
      

  3.   

    代码改动完要让你自己写的这个类起作用也就是要在struts.xml里面指定文件上传的解析类为你自己的这个类
    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="multipart" class="你自己的解析类" scope="default" />
    <constant name="struts.multipart.parser" value="multipart" />
      

  4.   

    恩,这个肯定要配置啊<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="requestParser"
            class="com.emily.relation.sys.model.MyMultiPartRequest" scope="default" optional="true" />
      <constant name="struts.multipart.handler" value="requestParser" />
    话说常量名不一样哦
      

  5.   

    楼主这个常量名是哪个版本的我没见过.我所用版本的常量名就是我写的,要知道你自己所用版本的常量名你可以直接到你自己所用版本的struts2-core.jar里面看那个struts-default.xml里面就有了.
      

  6.   

    恩,我的是    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default"/>
        <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" />
        <constant name="struts.multipart.handler" value="jakarta" />
      

  7.   

    现在就很奇怪了,我上传是被监听到的,但是久没运行update方法,这个方法我看是说隔段时间去检查上传进度,需要设置周期吗之类的
      

  8.   

    如果你监听器已经起作用了不可能没执行update方法,这个方法不会隔断时间去检查上传进度.每次解析就会执行update
      

  9.   

    那你肯定动了其它地方我说了你把人家原来实现的那个JakartaMultiparRequestParser源码复制进来只要改动parseRequest部分增加一个监听器就可以了其它的完全不动
      

  10.   

    问题找到了,就是版本的原因,我现在把我用的struts2源码的JakartaMultiPartRequest类全部复制,再改parseRequest方法,就可以了。之前是直接复制别人的代码,谢谢了,耐心的帮我分析原因,分很少,我也只有这点分了,呵呵呵,再次感谢