[翻譯]ASP.NET(C#) 中的文件上傳進度條

作者:azamsharp
翻譯:sharpcn

介紹:
幾天前,我在論壇上看到一個“如何創建文件上傳進度條”的問題。大家知道,我們有上傳客戶端文件到服務器端的控件,但是這個控件並不提供任何關於上傳進度的信息。如果客戶端上傳文件(尤其是大文件),而頁面上沒有任何變化,就不容易知道上傳操作是否在進行,有多少還沒有傳完。解決方案就是使用一些技術方法在客戶端顯示上傳進度。
背景知識:
在這篇文章中,我並不主講“如何將文件上傳到服務器端”。向大家推薦Konstantin Vasserman的一篇精彩文章:“用ASP.NET上傳文件”。
我想說幾句關於服務器上傳的知識。如果客戶端不向服務器端提交資源請求,服務器端將不向客戶端發送任何信息,所以向客戶端發送文件上傳的進度消息是不可能的。爲了解決這個問題,我們必須讓客戶端向服務器端發送請求。下面的這一小段Javascript代碼將在2秒中之後向服務器端放鬆請求。
<script>
    setTimeOut(“_doPostBack('btnRefresh','')“, 2000);
</script>
在這段代碼中,我使用了可以表示上傳信息的【PostBack】事件,她將觸發由Asp.net創建的【_doPostBack】事件。
如何做:
好了,道理是很簡單的。客戶端向服務器端請求上傳頁面,當她第一次加載的時候,顯示上傳的窗體頁面。當點擊“上傳”按鈕的時候,PostBack (回傳)事件被髮送到服務器端。服務器端代碼創建一個負責文件上傳並顯示最終信息的進程。頁面使用上面的Javascript代碼每2秒鐘刷新一次頁面並更新上傳信息。當文件上傳完畢,結果就顯示出來了。

要點就是讀取數據包中的數據。下面是上傳文件的程序。
private void uploadThread()
{
    byte[] b = new byte[1024];
    int read = 0;
    try
    {
        using (FileStream fs = new FileStream(_filename, FileMode.Create))
        {
            while ((read = _stream.Read(b, 0, b.Length)) > 0)
            {
                fs.write(b, 0, read);
                _bytesRead += read);
                System.Threading.Thread.Sleep(100);
            }
        }
    }
    catch(Exception ex)
    {
        _exception = ex;
    }
    _uploaded = true;
}

你可以看出,數據是以1024字節爲單位進行加載的。每次數據包被拷貝的時候,BytesRead屬性就開始更新。緩衝的越多,差別就越大(上傳大文件的時候這種效果顯而易見 sharpcn注。)
使用示例:
這個 FileUploadTread類已經支持數據上傳了。現在要做的就是實例化這個類。
FileUploadThread fut = new FileUploadThread(Server.MapPath(“files/the_filename“), theFile.PostedFile.InputStream);
繼續驗證獲取上傳進程信息。
if (!fut.Upload)
{
    // 讀取進程信息
    string info = String .Format(“{0} of {1} bytes {2} %)“,fut.BytesRead, fut.Length, fut.Persent);
}
else
{
    // 文件已經被上傳
}

如需退出上傳,只需 Call FileUploadThread類的 Cancel()方法。
fut.Cancel();

這裏有一個狡猾的事情。就是如果用戶關閉瀏覽器,上傳仍會繼續進行,直到發生超時或者上傳完畢。到目前爲止,我還沒有找到修復這個BUG的方法。

這個示例描述了上傳頁所需的所有必要信息。

  • 上傳窗體
  • 上傳進度條
  • 上傳結果

還有一個事情我想說的是,ASP.NET限制上傳數據大小,如果數據大於上傳最大限度值(MaxRequestLeght),請求將不被處理。最大限度值是由 web.config 或者 machine.config httpRuntime決定的。這兒有一個如何將最大限度值設置爲 10MB 的例子。
<httpRuntime maxRequestLength=”10240”
                     useFullyQualifiedRedirectUrl=”true”
                     executionTimeout=”45” />

關於這方面的詳細信息,請參考MSDN.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章