asp中使用组件上传时,有点麻烦就是不知道上传进度是多少,虽然有的提供了上传进度条,例如abcupload(下载地址:http://www.websupergoo.com)已经提供了显示当前上传状态的方法, 里面就有专门的实例(在安装目录的examples下面的progressupload.htm),它是提交数据的同时弹出一个反映进度的页面(progressbar.asp),然后通过这个页面自刷新来每隔一点时间获取当时的上传状态,然后把它们显示出来,但是用页面自刷新的方法效率比较低,不不好调节刷新时间间隔(最小间隔为1秒),而且服务器端返回数据量大,所以不能很好的实时反映上传情况。在客户端使用javascript调用msxml对象和settimout方法去定时load一个xml文件可以实现无刷新定时获取服务器端数据,在这里可以让progressbar.asp输出xml格式的数据,然后供客户端load,仅返回必要的几个参数,这样:页面不刷新;传输的数据少,不需要把所有数据全传到客户端 ,只传输反映状态的数据,如果定时器设置的时间足够小,那么我们就可以"实时"看到上传的状况了。以下就以abcupload4为例来说明怎么来制作实时的文件上传进度条。
(注:我们在abcupload自带例子基础上改进。)
progressupload.htm(上传文件的前台提交,我们让进度条在这个里面显示)
<html>
<body>
<script language="javascript">
<!--
theuniqueid = (new date()).gettime() % 1000000000;
function s() //让数据提交的同时执行显示进度条的函数
{
bar(); //开始执行反映上传情况的函数
document.myform.action = "progressupload.asp?id=" + theuniqueid; //处理上传数据的程序
document.myform.target="up" //将提交的数据放在一个名字是up隐藏的iframe里面处理,这样提交的页面就不会跳转到处理数据的页
document.myform.submit(); //提交表单
}
function bar()
{
bar1.style.display=''; //让显示上传进度显示的层的可见
var timeoutid=null; //这个变量是作定时器的id
var oxmldoc = new activexobject('msxml'); //创建'msxml'对象
surl = "progressbar.asp?id=" + theuniqueid + "&temp="+math.random(); //获取上传状态数据的地址
oxmldoc.url = surl; //load数据
var oroot=oxmldoc.root; //获取返回xml数据的根节点
if(oroot.children != null)
{
if (oroot.children.item(0).text-100==0) //文件上传结束就取消定时器
cleartimeout(timeoutid)
percentdone.style.width=oroot.children.item(0).text+"%"; //设置进度条的百分比例
//根据返回的数据在客户端显示
min.innerhtml=oroot.children.item(1).text; //显示剩余时间(分钟)
secs.innerhtml=oroot.children.item(2).text; //显示剩余时间(秒钟)
bytesdone.innerhtml=oroot.children.item(3).text; //已上传数据大小
bytestotal.innerhtml=oroot.children.item(4).text; //总大小
bytespersecond.innerhtml=oroot.children.item(5).text; //传输速率
information.innerhtml=oroot.children.item(6).text; //上传信息
}
if (oroot.children.item(0).text-100<0) //只要文件没有传完,就每隔多少时间获取一次数据
timeoutid = settimeout("bar()",50) //这里设定时间间隔是0.05秒,你也可以根据你的情况修改获取数据时间间隔
}
//-->
</script>
<form name="myform" method="post" action="progressupload.asp" enctype="multipart/form-data" target=up>
<input type="file" name="filefield1"><br>
<input type="button" name="dosubmit" value="upload" onclick="s()"><br>
<div id=bar1 style="display:none">
<table border="0" width="100%">
<tr>
<td><font face="verdana, arial, helvetica, sans-serif" size="2"><b>传送:</b></font></td>
</tr>
<tr bgcolor="#999999">
<td>
<table border="0" width="" cellspacing="1" bgcolor="#0033ff" id=percentdone>
<tr>
<td><font size=1> </font></td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table border="0" width="100%">
<tr>
<td><font face="verdana, arial, helvetica, sans-serif" size="1">剩余时间:</font></td>
<td><font face="verdana, arial, helvetica, sans-serif" size="1">
<span id=min></span> 分
<span id=secs></span> 秒
(<span id=bytesdone></span> kb of
<span id=bytestotal></span> kb 已上传)</font></td>
</tr>
<tr>
<td><font face="verdana, arial, helvetica, sans-serif" size="1">
传送速度:</font></td>
<td><font face="verdana, arial, helvetica, sans-serif" size="1">
<span id=bytespersecond></span> kb/秒</font></td>
</tr>
<tr>
<td><font face="verdana, arial, helvetica, sans-serif" size="1">信息:</font></td>
<td><font face="verdana, arial, helvetica, sans-serif" size="1"><span id=information></span></font></td>
</tr>
</table>
</td>
</tr>
<tr></tr>
</table>
</div>
<iframe name="up" style="display:none"></iframe>
</form>
</body>
</html>
progressbar.asp(返回上传状况数据的文件)
<%@enablesessionstate=false%>
<%
on error resume next
set theprogress = server.createobject("abcupload4.xprogress") '创建上传组件对象
theprogress.id = request.querystring("id")
'将返回数据以xml格式输出
%>
<?xml version="1.0" encoding="gb2312" ?>
<plan>
<percentdone><%=theprogress.percentdone%></percentdone>
<min><%=int(theprogress.secondsleft/60)%></min>
<secs><%=theprogress.secondsleft mod 60%></secs>
<bytesdone><%=round(theprogress.bytesdone / 1024, 1)%></bytesdone>
<bytestotal><%=round(theprogress.bytestotal / 1024, 1)%></bytestotal>
<bytespersecond><%=round(theprogress.bytespersecond/1024, 1)%></bytespersecond>
<information><%=theprogress.note%></information>
</plan>
progressupload.asp(处理上传文件)
<%@enablesessionstate=false%>
<%
response.expires = -10000
server.scripttimeout = 300
set theform = server.createobject("abcupload4.xform")
theform.overwrite = true
theform.maxuploadsize = 8000000
theform.id = request.querystring("id")
set thefield = theform("filefield1")(1)
if thefield.fileexists then
thefield.save thefield.filename
end if
%>
<html>
<body>
传送结束
</body>
</html>
对于其他组件上传,原理也就差不多了,只是方法不一样罢了。
希望大家有什么意见和建议和我联系:)
junminliu@msn.com
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器