上一篇博文里面详细介绍了Java Servlet 文件上传,这篇博文将为文件上传添加进度条,其中会利用DWR和Extjs。
1、项目的结构图
(1)要导入相应的JAR包和EXTJS文件。
(2)FileProgressListener
package com.fileupload;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.ProgressListener;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory.WebContextBuilder;
import org.directwebremoting.impl.DefaultWebContextBuilder;
public class FileProgressListener implements ProgressListener {
private long last_percentage = 0;
private long percentage = 0;
private HttpServletRequest request;
private HttpServletResponse response;
public FileProgressListener(HttpServletRequest request, HttpServletResponse response){
this.request = request;
this.response = response;
}
public void update(long pBytesRead, long pContentLength, int pItems) {
percentage = (pBytesRead * 100) / pContentLength;
if(percentage > 0 && percentage % 5 == 0 && percentage > last_percentage){
last_percentage = percentage;
System.out.println("已完成"+percentage+"%,文件大小是:"+pContentLength);
updateProgress(percentage);
}
}
/**
* 向页面index.jsp推送文件上传完成的百分比,推送到方法refreshProgress中。
* @param percentage
*/
public void updateProgress(long percentage){
ScriptBuffer scriptBuffer = new ScriptBuffer();
scriptBuffer.appendScript("try{");
scriptBuffer.appendScript("if(refreshProgress){");
scriptBuffer.appendScript("refreshProgress");
scriptBuffer.appendScript("(");
scriptBuffer.appendData(percentage);
scriptBuffer.appendScript(")}");
scriptBuffer.appendScript("} catch(e){alert(e)}");
ServerContext sc = ServerContextFactory.get();
WebContextBuilder webBuilder = new DefaultWebContextBuilder();
webBuilder.engageThread(sc.getContainer(), request, response);
WebContext webContext = webBuilder.get();
if(webContext == null){
return;
}
Collection<ScriptSession> sessions = webContext.getScriptSessionsByPage("/FileUpload/index.jsp");
if (sessions == null || sessions.isEmpty()) {
return;
}
for (ScriptSession scriptSession : sessions) {
if (scriptSession != null) {
scriptSession.addScript(scriptBuffer);
}
}
}
public void setPercentage(long percentage) {
this.percentage = percentage;
}
public long getPercentage() {
return percentage;
}
}
</