上傳的進度條 實時反映上傳情況
發(fā)表時間:2023-08-12 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]asp中使用組件上傳時,有點麻煩就是不知道上傳進度是多少,雖然有的提供了上傳進度條,例如abcupload(下載地址:http://www.websupergoo.com)已經(jīng)提供了顯示當前上傳狀態(tài)...
asp中使用組件上傳時,有點麻煩就是不知道上傳進度是多少,雖然有的提供了上傳進度條,例如abcupload(下載地址:http://www.websupergoo.com)已經(jīng)提供了顯示當前上傳狀態(tài)的方法,里面就有專門的實例(在安裝目錄的Examples下面的progressupload.htm),它是提交數(shù)據(jù)的同時彈出一個反映進度的頁面(progressbar.asp),然后通過這個頁面自刷新來每隔一點時間獲取當時的上傳狀態(tài),然后把它們顯示出來,但是用頁面自刷新的方法效率比較低,不不好調(diào)節(jié)刷新時間間隔(最小間隔為1秒),而且服務(wù)器端返回數(shù)據(jù)量大,所以不能很好的實時反映上傳情況。在客戶端使用javascript調(diào)用MSXMl對象和setTimout方法去定時load一個xml文件可以實現(xiàn)無刷新定時獲取服務(wù)器端數(shù)據(jù),在這里可以讓progressbar.asp輸出xml格式的數(shù)據(jù),然后供客戶端load,僅返回必要的幾個參數(shù),這樣:頁面不刷新;傳輸?shù)臄?shù)據(jù)少,不需要把所有數(shù)據(jù)全傳到客戶端 ,只傳輸反映狀態(tài)的數(shù)據(jù),如果定時器設(shè)置的時間足夠小,那么我們就可以"實時"看到上傳的狀況了。以下就以abcupload4為例來說明怎么來制作實時的文件上傳進度條。
(注:我們在abcupload自帶例子基礎(chǔ)上改進。)
progressupload.htm(上傳文件的前臺提交,我們讓進度條在這個里面顯示)
<html>
<body>
<script language="javascript">
<!--
theUniqueID = (new Date()).getTime() % 1000000000;
function s() //讓數(shù)據(jù)提交的同時執(zhí)行顯示進度條的函數(shù)
{
bar(); //開始執(zhí)行反映上傳情況的函數(shù)
document.myform.action = "progressupload.asp?ID=" + theUniqueID; //處理上傳數(shù)據(jù)的程序
document.myform.target="up" //將提交的數(shù)據(jù)放在一個名字是up隱藏的iframe里面處理,這樣提交的頁面就不會跳轉(zhuǎn)到處理數(shù)據(jù)的頁
document.myform.submit(); //提交表單
}
function bar()
{
bar1.style.display=''; //讓顯示上傳進度顯示的層的可見
var timeoutid=null; //這個變量是作定時器的ID
var oXMLDoc = new ActiveXObject('MSXML'); //創(chuàng)建'MSXML'對象
sURL = "progressbar.asp?ID=" + theUniqueID + "&temp="+Math.random(); //獲取上傳狀態(tài)數(shù)據(jù)的地址
oXMLDoc.url = sURL; //load數(shù)據(jù)
var oRoot=oXMLDoc.root; //獲取返回xml數(shù)據(jù)的根節(jié)點
if(oRoot.children != null)
{
if (oRoot.children.item(0).text-100==0) //文件上傳結(jié)束就取消定時器
clearTimeout(timeoutid)
PercentDone.style.width=oRoot.children.item(0).text+"%"; //設(shè)置進度條的百分比例
//根據(jù)返回的數(shù)據(jù)在客戶端顯示
min.innerHTML=oRoot.children.item(1).text; //顯示剩余時間(分鐘)
secs.innerHTML=oRoot.children.item(2).text; //顯示剩余時間(秒鐘)
BytesDone.innerHTML=oRoot.children.item(3).text; //已上傳數(shù)據(jù)大小
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) //只要文件沒有傳完,就每隔多少時間獲取一次數(shù)據(jù)
timeoutid = setTimeout("bar()",50) //這里設(shè)定時間間隔是0.05秒,你也可以根據(jù)你的情況修改獲取數(shù)據(jù)時間間隔
}
//-->
</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(返回上傳狀況數(shù)據(jù)的文件)
<%@EnableSessionState=False%>
<%
On Error Resume Next
Set theProgress = Server.CreateObject("ABCUpload4.XProgress") '創(chuàng)建上傳組件對象
theProgress.ID = Request.QueryString("ID")
'將返回數(shù)據(jù)以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>
傳送結(jié)束
</body>
</html>
對于其他組件上傳,原理也就差不多了,只是方法不一樣罷了。
希望大家有什么意見和建議和我聯(lián)系:)
junminliu@msn.com