按照网上大神们的做法,一步步实现的,可是为什么总是不能成功呢。那么要是有兴趣也试试看啊。 下面我贴出原文: 原理: 利用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对象
xml指定自己的文件上传解析类有错误 <constant name="struts.multipart.parser" value="requestParser" />
网上很多很多文章都是 <constant name="struts.multipart.handler" value="requestParser" /> 可是这样就是不对。我想问问是那些网上的文章都是错误的还是struts2版本变了 引起的不同。 还有阁下为何如此厉害 怎么学的
这样修改过后是可以执行了。但是为什么我action里面拿到的进度总是100% 我输出了一下,发现其先执行监听类,等监听类里面文件进度为100%的时候,才会去调用我的获取进度条的action 方法,请问这个该如何解决?? 你取进度的action应该是另一个action。因为struts2文件上传的时候你到文件action的时候其实文件已经传到服务器了。不知道你前台是怎么传的建议使用jquery.form.js的ajaxSubmit来传输文件。这样可以异步传输。此时你ajax请求取进度的action应该在文件上传之前就要用js的setInteval每多少时间就去取。如果你等文件上传的请求到达action的时候文件其实已经传完了所以你取到的进度一直都是100%。当然这里小文件的话会传输太快建议用大点的文件才能看出效果 补充下如果用小文件也可以看出效果就是在你监听器中每次都让线程sleep下也就是增加Thread.sleep(1000)每次解析都睡眠一秒这样10MB左右的文件也能看出进度条的效果
|