2011-05-09 43 views
0

我在.NET網站上有文件上傳。我使用FileUpload .NET控件進行上傳,並將表單的目標設置爲隱藏的iframe。我使用客戶端腳本來提交表單,然後在頁面上顯示一個進度條,該進度條對同一臺服務器上的ashx文件執行AJAX請求,並每秒更新一次進度條。ASP.NET 2.0中的文件上傳進度條

下面的代碼的文件時上傳的部分 -

string fileString = StringGenerator.GenerateString(8); 
    System.IO.Stream fileStream = System.IO.File.Create(fileRoot+ fileString + ".mp3"); 
    System.IO.Stream inputStream = fileUpload.PostedFile.InputStream; 
    byte[] buffer = new byte[256]; 
    int read; 
    if(StaticProgress.Progress.ContainsKey(trackId)) StaticProgress.Progress[trackId] = 0d; 
    else StaticProgress.Progress.Add(trackId, 0d); 
    int totalRead = 0; 
    long length = inputStream.Length; 
    while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     totalRead += read; 
     fileStream.Write(buffer, 0, read); 
     StaticProgress.Progress[trackId] = (double)totalRead/(double)length; 
    } 

StaticProgress.Progress是返回一個靜態字典的屬性。 這裏是在ashx的文件,該文件得到我總是「ID未找到」,而該文件被上傳,但是當文件上傳完畢,我得到一個成功的

context.Response.ContentType = "text/javascript"; 
    int id; 
    if(!int.TryParse(context.Request.QueryString["id"], out id) || !StaticProgress.Progress.ContainsKey(id)) 
     context.Response.Write("{\"error\":\"ID not found\"}"); 
    else 
     context.Response.Write("{\"id\":\"" + id + "\",\"decimal\":" + StaticProgress.Progress[id] + "}"); 

這裏進步的代碼 - 十進制:1.

我試過在此之前使用會話變量,並得到了相同的結果。我試過使用公共靜態(線程安全?)字典,但我得到了相同的結果。有沒有人遇到過這樣的事情?在客戶端請求被完全接收之前,代碼是否執行?

回答

1

標準文件上傳控件不提供進度功能 - 只有服務器完全接收文件後才能接收文件。在打開.PostedFile文件流時,文件已經完全上傳。

有許多更好的解決方案上傳討論here

+0

謝謝,我會看看他們。我之前在我的搜索中看到過這個頁面,但沒有人真正解釋過,標準文件上傳控件將不允許我從輸入流中讀取,直到全部收到。所以我試圖自己做(我喜歡挑戰)。 – Connell 2011-05-09 22:54:17