明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

上傳的進度條 實時反映上傳情況

[摘要]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>&nbsp;</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