日期:2014-05-18  浏览次数:20719 次

Struts2文件上传进度条
我按照网上大神们的做法,一步步实现的,可是为什么总是不能成功呢。那么要是有兴趣也试试看啊。
下面我贴出原文:
   原理:
     利用Ajax在客户端一直查询服务器端的上传进度,取得进度的状态文本信息(xml,json格式的文本等),然后利用JS解析,显示在前台。
     在Struts2. 0中,框架事先已经定义一种监听器:ProgressListener(进度监听器),里面有一个update(long readedBytes, long totalBytes, int currentItem)方法,其中,readedBytes是已经上传到服务器的位数,而totalBytes是上传文件总位数.当文件已二进制的方式上传时,每上传一部分数据,就会调用这个方法一次。故要实现监听进度,必须实现这个接口,并实现update方法,在update方法中保存这个进度到session。当客服端需要进度的信息时,只需要访问某个action,在这个action中读取session中保存的进度状态就可以了.
   上传文件可大致分为两个阶段:1. 上传到服务器上,在临时目录中 2.从临时目录中把文件移到指定目录(由自己写的action处理),而struts2.的监听器只监听第一阶段。
   
实现:
(源代码下载: http://download.csdn.net/source/3568014)
第一步:
    实现ProgressListener接口,实现update( )方法,详情见action包中的FileUploadListener.java 文件,里面有一个自定义的类:State ,它描述的是进度的状态,详情请看State注释。Update方法要做的就是不断地更新session中的state对象 代码如
 

  8. public class FileUploadListener implements ProgressListener{  
9.     private HttpSession session;  
10.       
11.     public FileUploadListener(HttpServletRequest request) {  
12.            session = request.getSession();  
13.            State state = new State();  
14.            session.setAttribute("state", state);  
15.     }  
16.     @Override  
17.     public void update(long readedBytes, long totalBytes, int currentItem) {  
18.         // TODO Auto-generated method stub  
19.            System.out.println("update:"+readedBytes+";"+totalBytes+";"+currentItem);  
20.              
21.            State state = (State) session.getAttribute("state");  
22.              
23.            state.setReadedBytes(readedBytes);  
24.            state.setTotalBytes(totalBytes);  
25.            state.setCurrentItem(currentItem);  
26.     }