带进度条的文件上传
uploadservlet只是实现了普通的文件上传,并且附带普通文本域的提交。如果需要显示进度条,实时显示文件上传进度
需要使用Ajaxj技术
工作原理
其实际就是在处理上传文件的同时,将上传进度的信息例如文件总长吨,已经上传多少,传输速率写入session中,客户端游览器
利用Ajax技术再新开一个独立的进程从session中获取上传进度信息,并实时显示,Ajax技术能够 不刷新页面获取服务器数据。session
可看做是服务器内存,可以用于存放少量的客户信息。
上传进度条用两个<div>标签实现,通过控制<div>de css属性就可以显示一个html版的进度条。<div>标签连同css样式,javascript脚本
Ajax技术,可以实现非常丰富的效果
代码如下
<style type="text/css">
#progressBar{width; 400px; height; 12px;background;#FFFFFF;border; 1px
slid #000000;padding;1px;}
#progressBaritem{width:30%;height:100%;background:#FF0000;}
</style>
<div id="progressBar"><"div id="progressBaritem"></div></div>
上传监听器
commons-fileupload版1.2支持上传监听,只需要实现一个监听器,并把它添加到上传组件上即可。监听器需要实现它的progresslistener
举例如下
public class uploadListener implements progressListener{
private uploadstatus status; 记录上传信息的javaBean
public uploadListener(uploadstatus status){ //构造函数
this.status=status;
}
public void update(long bytesRead, long contentLength,int items){
status.setBytesRead(bytesRead); 已经读取的数据长度
status.setContentLength(contenLength); 所上传的文件总长度
status.setItems(items); 正在保存的第几个文件
}
}
prongressListener 接口只有一个方法:update(long bytesRead,long contenLength,int items).
参数byteRead表示已经上传的字节数contentLength表示上传文件的总长度(如果为-1则表示总长度未知)
items表示正在上传的第几个文件。
添加了监听器后,上传组文件在上传文件时,会不断的回调该方法,回传这些数据。利用这些数据,就可以知道文件上传的进度,并用进度条实时的现实出来
因此需要把这些数据保存起来。在上述代码中把数据保存到了一个uploadstatus中而这是一个普通的java Bean,相关的代码如下
public class uploadstatus{
private long bytesRead;
private long contentLength;
private int items;
private longstartTime=System.currenTimeMillis();
public long getByesRead(){
return bytesRead;
}
public void setBytesRead(long bytesRead){
this.bytesRead=bytesRead;
}
public long getContentLength(){
return contentLength;
}
public void setContentLength(iong contentLength){
this.contentLength=contentLength;
}
public int getItems(){
return items;
}
public void setItems(int items){
this.items=items;
}
public long getstartTime(){
return startTime;
}
public void setstartTime(long startTime){
this.startTime=startTime;
}
}