Struts2文件上传进度条,该怎么解决
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对象 代码如
State类:
第二步:
将监听器注入到struts2.0的MultiPartRequest封装类中,客户端发送request到服务器,struts2.0会将request封装成MultiPartRequest。因此必须将监听器注入到MultiPartRequest中。只需要在MultiPartRequest中加入以下两句:
FileUploadListener progressListener = new FileUploadListener(servletRequest);
upload.setProgressListener(progressListener);//添加自己的监听器
所以重新写一个新类MyMultiPartRequest代替MultiPartRequest ,代码与org.apache.struts2.dispatcher.multipart.MultiPartRequest 一样,在方法
private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) 中加入监听器.
------解决思路----------------------
xml指定自己的文件上传解析类有错误
<constant name="struts.multipart.parser" value="requestParser" />
------解决思路----------------------
请教,如果多文件上传,如何给每个上传的文件一个进度条,又如果总进度给个进度条呢?
我按照网上大神们的做法,一步步实现的,可是为什么总是不能成功呢。那么要是有兴趣也试试看啊。
下面我贴出原文:
原理:
利用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. }
27. }
State类:
3. public class State {
4. private long readedBytes = 0L;/*已经上传的位数*/
5. private long totalBytes = 0L;/*文件所占位数*/
6. private int currentItem = 0;
7. private int rate=0; /*上传百分比*/
8. public long getReadedBytes() {
9. return readedBytes;
10. }
11.
12. public void setReadedBytes(long readedBytes) {
13. this.readedBytes = readedBytes;
14. }
15.
16. public long getTotalBytes() {
17. return totalBytes;
18. }
19.
20. public void setTotalBytes(long totalBytes) {
21. this.totalBytes = totalBytes;
22. }
23. public int getCurrentItem() {
24. return currentItem;
25. }
26.
27. public void setCurrentItem(int currentItem) {
28. this.currentItem = currentItem;
29. }
30.
31. public int getRate() {
32. return rate;
33. }
34. public void setRate(int rate) {
35. this.rate = rate;
36. }
37. }
第二步:
将监听器注入到struts2.0的MultiPartRequest封装类中,客户端发送request到服务器,struts2.0会将request封装成MultiPartRequest。因此必须将监听器注入到MultiPartRequest中。只需要在MultiPartRequest中加入以下两句:
FileUploadListener progressListener = new FileUploadListener(servletRequest);
upload.setProgressListener(progressListener);//添加自己的监听器
所以重新写一个新类MyMultiPartRequest代替MultiPartRequest ,代码与org.apache.struts2.dispatcher.multipart.MultiPartRequest 一样,在方法
private List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) 中加入监听器.
------解决思路----------------------
xml指定自己的文件上传解析类有错误
<constant name="struts.multipart.parser" value="requestParser" />
------解决思路----------------------
请教,如果多文件上传,如何给每个上传的文件一个进度条,又如果总进度给个进度条呢?