监听文件上传进度
如果你希望可以上传很大的文件,这时,你可能想将上传的状态告诉用户,如已经接收了多少。
观察上传进度需要通过一个处理监听器来实现。
public class UploadProgressListener implements ProgressListener {
/**
* pBytesRead,到目前为止已经读取的字节数
* pContentLength,上传文件的总长度
* pItems,正在处理第几个文件项(0 = 一个项目还没处理, 1 = 第一个项目正在被读取, ...)
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("我们正在读取文件项目 " + pItems);
//pContentLength == -1,说明无法得到总数据长度
if (pContentLength == -1) {
System.out.println("到目前为止已经读取了 " + pBytesRead + " 字节的数据。");
} else {
System.out.println("到目前为止已经读取了" + pContentLength
+ " 中的 "+ pBytesRead + " 字节");
}
}
}
上面这个监听器是有问题的。因为它会非常频繁地被调用。这会带来性能问题。一个比较好
的解决办法是减少调用。如下代码,为监听器类增加一个kiloBytes实例属性,其值默认为-1,每当
pBytesRead/1024的结果变化时(即以KB为单位增加时),将新的计算结果赋值给kiloBytes,然后
更新上传进度信息,否则什么都不做,直接返回。这样就可以减少信息更新的次数。如果上传的
文件非常大时,可以将KB单位改为MB,进一步减少信息更新的次数。
public class UploadProgressListener implements ProgressListener {
private long kiloBytes = -1;
/**
* pBytesRead,到目前为止已经读取的字节数
* pContentLength,上传文件的总长度
* pItems,正在处理第几个文件项(0 = 一个项目还没处理, 1 = 第一个项目正在被读取, ...))
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
long kBytes = pBytesRead / 1024;// 取1KB
if (kiloBytes == kBytes) {
return;
}
kiloBytes = kBytes;
System.out.println("我们正在读取文件项目 " + pItems);
//pContentLength == -1,说明无法得到总数据长度
if (pContentLength == -1) {
System.out.println("到目前为止已经读取了 " + pBytesRead + " 字节的数据。");
} else {
System.out.println("到目前为止已经读取了" + pContentLength
+ " 中的 "+ pBytesRead + " 字节");
}
}
}
在服务器端,我们只需设计一个对象,将进度信息封装到这个对象中,再将该对象保存在用户会
话中,利用上面示例代码不断的更新这个对象的状态。
在客户端,我们可以每隔n秒钟发起一次ajax请求,到会话中获取文件上传进度信息,直到上传完
毕。
郑州蜂鸟科技有限公司 申林 QQ:38185398 郑州软件开发兴趣小组群:38236716
学软件开发,到蜂鸟科技!超强的师资力量 、完善的课程体系 、超低的培训价格 、真实的企业项目。
地址:郑州市文化路丰产路口东50米丰产路21号SOHO世纪城西塔20楼F
电话:0371-63839606 手机:13838505572(申老师) 13673990036 (许老师)
QQ: 1073422643 1群:47614738 2群:108157678
网址:www.ntcsoft.com
posted on 2010-09-03 23:59
whistler 阅读(1591)
评论(0) 编辑 收藏