Struts2实现文件上传时显示进度条功能

  

,,,,,,最近在做一个资源共享的项目中,采用了Struts2.1.8 + Spring2.5.6 + hibernate3.32的框架整合方式进行开发。在文件上传这块,因为需要实现文件上传时显示进度条的功能,所以尝试了一下。怕以后忘记,先贴出来分享下。

  

,,,,,,要在上传文件时能显示进度条,首先需要实时的获知web服务端接收了多少字节,以及文件总大小,这里我们在页面上使用AJAX技术每一秒向服务器发送一次请求来获得需要的实时上传信息。但是当我们使用struts2后怎么在服务端获得实时的上传大小呢?这里需要用到commons-fileupload中的progressListener接口,实现这个接口,然后再实现一个自己的解析器,并在解析器中添加自己实现的那个progressListener,然后再替换struts2自带的解析器(struts2自带的解析器类没有添加progressListener),然后就可以了。下面看看主要的代码(技术有限,如有不对之处,望不吝点解):,

  

监听器:

        进口javax.servlet.http.HttpServletRequest;   进口javax.servlet.http.HttpSession;   进口org.apache.commons.fileupload.ProgressListener;      公共类ResourceProgressListener实现ProgressListener {   私人HttpSession会话;   公共ResourceProgressListener (HttpServletRequest请求){   会话=request.getSession ();   ResourceFileUploadStatus newUploadStatus=new ResourceFileUploadStatus ();   会话。setAttribute (“currentUploadStatus newUploadStatus);      }   公共空间更新(长readedBytes, totalBytes, int currentItem) {   ResourceFileUploadStatus状态=(ResourceFileUploadStatus) session.getAttribute (“currentUploadStatus”);   status.setReadedBytes (readedBytes);   status.setTotalBytes (totalBytes);   status.setCurrentItem (currentItem);      }      }      之前      

上传状态类:

        公开课ResourceFileUploadStatus {   私人长readedBytes=0 l;   私人长totalBytes=0 l;   私人int currentItem=0;      公共长getReadedBytes () {      返回readedBytes;   }   公共空间setReadedBytes(长字节){   readedBytes=字节;   }      公共长getTotalBytes () {   返回totalBytes;   }   公共空间setTotalBytes(长字节){   totalBytes=字节;   }   公共int getCurrentItem () {   返回currentItem;      }      公共空间setCurrentItem (int项){   currentItem=项目;      }      }      之前      

实现自己的解析器类:方法比较简单,找到struts2实现的解析器类,把代码拷贝过来然后添加上监听器即可。这个类代码较多就不整个文件拷了,主要是在解析方法里添加.Parse方法代码如下:红色标注部分即是需要自己添加的progressListener。

        公共空间解析(HttpServletRequest servletRequest字符串saveDir)   抛出IOException {      System.out.println(“执行自定义MultiPartRequest”);   DiskFileItemFactory fac=new DiskFileItemFactory ();//确保数据写入文件   fac.setSizeThreshold (0);   如果(saveDir !=null) {   前沿空中管制官。setRepository(新文件(saveDir));   }//解析请求      尝试{      ServletFileUpload上传=new ServletFileUpload (fac);   upload.setSizeMax(最大尺寸);      ResourceProgressListener progressListener=new ResourceProgressListener (servletRequest);//新建一个监听器      upload.setProgressListener (progressListener);//添加自己的监听器      列表项=upload.parseRequest (createRequestContext (servletRequest));      (对象item1:物品){      FileItem项=(FileItem) item1;   如果(LOG.isDebugEnabled ()) LOG.debug(“发现项”+ item.getFieldName ());   如果(item.isFormField ()) {   LOG.debug(“项目是一个常规的表单字段”);   List值;   如果(params.get (item.getFieldName ()) !=null) {   值=params.get (item.getFieldName ());   其他}{      值=new ArrayList ();      }   字符串charset=servletRequest.getCharacterEncoding ();   如果(字符集!=null) {   values.add (item.getString(字符集));   其他}{      values.add (item.getString ());   }      params.put (item.getFieldName()、价值观);      其他}{      LOG.debug(“项目文件上传”);//跳过文件上传,没有一个文件名——这意味着没有选择文件。   如果(item.getName ()==null | | item.getName () .trim () . length () & lt;1) {   LOG.debug(“没有上传文件的字段:“+ item.getFieldName ());   继续;      }         List

Struts2实现文件上传时显示进度条功能