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

转载 2012年03月29日 11:26:28

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

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

 

监听器:

importjavax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

importorg.apache.commons.fileupload.ProgressListener;

 

public class ResourceProgressListenerimplements ProgressListener {

   private HttpSession session;

 

   public ResourceProgressListener(HttpServletRequest request){

      session = request.getSession();

      ResourceFileUploadStatus newUploadStatus = newResourceFileUploadStatus();

      session.setAttribute("currentUploadStatus", newUploadStatus);

    }

 

   public void update(long readedBytes,long totalBytes, int currentItem) {

      ResourceFileUploadStatus status = (ResourceFileUploadStatus)session.getAttribute("currentUploadStatus");

      status.setReadedBytes(readedBytes);

      status.setTotalBytes(totalBytes);

      status.setCurrentItem(currentItem);

    }

}

上传状态类:

public class ResourceFileUploadStatus{

   private long readedBytes = 0L;

   private long totalBytes = 0L;

   private int currentItem = 0;

   

   public long getReadedBytes() {

      return readedBytes;

    }

   public void setReadedBytes(long bytes) {

      readedBytes = bytes;

    }

   public long getTotalBytes() {

      return totalBytes;

    }

   public void setTotalBytes(long bytes) {

      totalBytes = bytes;

    }

   public int getCurrentItem() {

      return currentItem;

    }

   public void setCurrentItem(int item) {

      currentItem = item;

    }

}

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

public void parse(HttpServletRequestservletRequest, String saveDir)

           throws IOException {

   System.out.println("执行自定义MultiPartRequest");

       DiskFileItemFactory fac = new DiskFileItemFactory();

       // Make sure that the data is written to file

       fac.setSizeThreshold(0);

       if (saveDir != null) {

           fac.setRepository(new File(saveDir));

       }

 

       // Parse the request

       try {

           ServletFileUpload upload = new ServletFileUpload(fac);

           upload.setSizeMax(maxSize);

          

           ResourceProgressListenerprogressListener = newResourceProgressListener(servletRequest);//新建一个监听器

           upload.setProgressListener(progressListener);//添加自己的监听器

           

           List items =upload.parseRequest(createRequestContext(servletRequest));

 

           for (Object item1 : items) {

               FileItem item = (FileItem) item1;

               if (LOG.isDebugEnabled()) LOG.debug("Founditem " + item.getFieldName());

               if (item.isFormField()) {

                   LOG.debug("Item is a normal form field");

                   List<String> values;

                   if (params.get(item.getFieldName()) != null) {

                       values = params.get(item.getFieldName());

                   } else {

                       values = newArrayList<String>();

                   }

                   String charset = servletRequest.getCharacterEncoding();

                   if (charset != null) {

                       values.add(item.getString(charset));

                   } else {

                       values.add(item.getString());

                   }

                   params.put(item.getFieldName(), values);

               } else {

                   LOG.debug("Item is a file upload");

 

                   // Skip file uploads that don't have a file name - meaning that nofile was selected.

                   if (item.getName() == null ||item.getName().trim().length() < 1) {

                       LOG.debug("No file has been uploaded for the field: " +item.getFieldName());

                       continue;

                   }

 

                   List<FileItem> values;

                   if (files.get(item.getFieldName()) != null) {

                       values = files.get(item.getFieldName());

                   } else {

                       values = newArrayList<FileItem>();

                   }

 

                   values.add(item);

                   files.put(item.getFieldName(), values);

               }

           }

       } catch (FileUploadException e) {

           LOG.warn("Unable to parse request", e);

           errors.add(e.getMessage());

       }

}

 

上面的类建立完成后,还需要做一项工作:在struts.xml中添加如下内容:

<beantype="org.apache.struts2.dispatcher.multipart.MultiPartRequest"name="requestParser"

   class="com.zeige.ResourceMultiPartRequest"scope="default" optional="true" />

<constant name="struts.multipart.handler"value="requestParser" />

 

下面就可以正常使用了,建立两个action,一个用来接收上传文件,以及对接收的文件作相应处理,处理完成后,在returnSUCCESS之前去除session中currentUploadStatus属性,一个用来为页面读取实时上传进度服务,这个类中只要将session中的currentUploadStatus对象拿出来按照相应格式返回给客户端即可。


Struts2实现文件上传并显示实时进度

基于浏览器的文件上传,特别是对于通过标签来实现上传的情况, 存在着严重的性能问题,因为用户提交了文件之后,在浏览器把文件上传到服务器的过程中,界面看上去似乎是静止的,如果是小文件还好些,如果不幸需要上...
  • z69183787
  • z69183787
  • 2016年09月14日 11:27
  • 2220

struts2实现文件上传进度条(前端JS+Java)(自我整理)

struts2实现文件上传进度条(前端JS+Java)(自我整理)
  • u011768325
  • u011768325
  • 2015年06月15日 09:05
  • 1910

struts2实现带进度条的文件上传

原理: 利用Ajax在客户端一直查询服务器端的上传进度,取得进度的状态文本信息(xml,json格式的文本等),然后利用JS解析,显示在前台。 在Struts2. 0中,框架事先已经定义一种监听器...
  • free_wilson
  • free_wilson
  • 2013年10月17日 10:24
  • 3213

Struts2实现文件上传并显示实时进度

我们为了改善用户界面,通常会在处理量大或者是网络速度较慢的时候,给用户显示一个处理进度,让用户心理有底,增强用户等待结果的耐心,以改善用户体验。为了达到这个效果,通常做法有两大类:简单等待和真实的处理...
  • zhouhua0104
  • zhouhua0104
  • 2014年07月18日 09:48
  • 2998

struts2+AJAX文件上传进度条的基本实现

最近想要用struts2来
  • qq791967024
  • qq791967024
  • 2014年10月23日 21:36
  • 1994

基于ajax实现文件上传并显示进度条

这篇文章主要介绍了基于ajax实现文件上传并显示进度条,需要的朋友可以参考下 下面给大家分享下基于ajax实现文件上传并显示进度条。在jsp部分,需要设计一个表单,form的属性添加 e...
  • zjd934784273
  • zjd934784273
  • 2016年01月08日 11:33
  • 842

基于AJAX的文件上传显示进度条实现

基于Ajax的文件上传要实现的功能要求,要在用户提交了上传按钮请求后,客户端其页面要显示文件上传进度条。       其整个功能时序图如图所示。  简单的说,要实现在客...
  • wepe12
  • wepe12
  • 2016年12月04日 20:57
  • 690

Android 上传文件到服务端,并显示进度条

最近在做上传文件的服务,简单看了网上的教程。结合实践共享出代码。 由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢。 Ok,先上代码。 Android 上传比较简单,主要用...
  • u013151336
  • u013151336
  • 2016年05月03日 17:30
  • 549

spring mvc文件上传实现进度条

文件上传应该大部分人都接触过,一般都是基于commons-fileupload组件来实现,SpringMVC的文件上传功能也是在commons-fileupload组件提供的功能上面做了一些包装功能,...
  • lwjshuai
  • lwjshuai
  • 2016年03月23日 11:12
  • 1708

java FTP上传文件(进度条显示进度)

java实现FTP上传有2种方式,一种是org.apache.commons.net.ftp.FTPClient这个jar包,一种是sun.net.ftp.FtpClient。不知道为什么,在使用前一...
  • u013401219
  • u013401219
  • 2015年06月12日 11:00
  • 2883
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Struts2实现文件上传时显示进度条功能
举报原因:
原因补充:

(最多只允许输入30个字)