日期:2014-05-17  浏览次数:20707 次

关于进度条,是基于Struts2的,实现ProgressListener接口
按照网上的方法,实现MultiPartRequest接口,配置自己的 自己新建监听器 ,每次上传,都可以监听到,具体是在新建ProgressListener的实现类,但是过后就没反应了,意思不是说ProgressListener的实现类中update方法会不停去获取上传文件进度吗,怎么我就运行update方法。。。。

------解决方案--------------------
这个问题之前就有人问过回答了不下三次了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