,,,,,,最近在做一个资源共享的项目中,采用了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实现文件上传时显示进度条功能