2011-10-08 54 views
2

我目前正在爲客戶端開發一個應用程序,該客戶端將使用管理面板將圖片上傳到圖片庫和一些其他掃描文檔到數據庫。我已成功編寫控制器操作以保存和檢索保存在數據庫中的文件。使用ASP.NET MVC將FileUpload升級到SQL Server 3

現在我被困在如何顯示文件上傳到數據庫時的進度條。我已經嘗試了幾個控件,比如jQuery的uploadify和其他一些控件。他們都成功地將文件保存到一個文件夾,儘管沒有上傳到MS-SQL數據庫。

這裏是我的模型樣本:

public Class myImages 
    { 
     [Key, Required] 
     public string ImageID { get; set; } 

     [Required, MaxLength(100), DisplayName("Image Title:")] 
     public string ImageTitle { get; set; } 

     [DisplayName("Image File:")] 
     public byte[] ImageData { get; set; } 
     public string ImageContentType { get; set; } 
    } 

我已經創造了基礎設施的函數返回上傳文件的字節數組,下面的代碼:

public byte[] uploadedFileToByteArray(HttpPostedFileBase file) 
    { 
     int nFileLen = file.ContentLength; 
     byte[] result = new byte[nFileLen]; 
     file.InputStream.Read(result, 0, nFileLen); 
     return result; 
    } 

...而這裏的控制行動創建

[HttpPost, ValidateInput(false), ValidateAntiForgeryToken] 
    public ActionResult Create(myImage myimage) 
    { 
     if (ModelState.IsValid) 
      { 
      myimage.ImageID = DateTime.Now.Ticks.ToString(); 
      myimage.ImageData = uploadedFileToByteArray(Request.Files[0]); 
      myimage.ImageContentType = Request.Files[0].ContentType; 

      db.Pictures.Add(picture); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
      } 
     return View(picture); 
    } 

正如我所說,上述代碼工作完美,唉,我似乎無法得到進度欄工作,而文件上傳。任何想法如何做到這一點?

我也嘗試上傳文件到一個臨時文件夾,然後讀取該文件的字節,然後上傳到SQL Server,這種方法的作品,但由於某種原因,我的客戶端不想這樣做,我也不是滿意這個解決方案。

我也注意到,當上傳文件時,Google的chrome會顯示上傳百分比,如果瀏覽器可以訪問客戶端的數據,有沒有辦法通過jQuery或Ajax訪問上傳/發送的字節來顯示進度條正在上傳?

我使用Visual Studio 2010,ASP.NET,MVC 3

回答

2

您需要讀取的字節數入內存塊,更新在一些服務器端可變的讀取數據量(在會話中,也許)可以通過您用來衡量進度的上傳插件訪問。因爲它是一次性讀取所有數據,無法報告部分進度。使用其他操作來報告目前爲進度指示器所讀取的數量。請注意,您可能需要使用異步控制器才能完成此項工作。

注意這只是一個想法。這將需要相當多的工作的是穩健,同時處理多個文件等

public byte[] uploadedFileToByteArray(HttpPostedFileBase file) 
{ 
    int nFileLen = file.ContentLength; 
    int currentPosition = 0; 
    byte[] result = new byte[nFileLen]; 
    Session["fileLen"] = nFileLen; 
    int bytesRead = file.InputStream.Read(result,0,1000); 
    while (bytesRead > 0) 
    { 
     currentPosition += bytesRead; 
     Session["progress"] = currentPosition; 
     bytesRead = file.InputStream.Read(result,currentPosition,1000); 
    } 
    return result; 
} 

public ActionResult ReportProgress() 
{ 
    int nFileLen = (int)Session["fileLen"]; 
    int progress = (int)Session["progress"]; 

    return Json(new { Progress = (float)progress/nFileLen, Complete = nFileLen >= progress }); 
} 
+0

我其實想與此嘗試AJAX,但讀字節塊的想法從來沒有來找我,我會盡力它。但AJAX partialview會讀取數據,另一個partial view會返回讀取的數據量?我對嗎? – Spitfire

+0

Ajax不適用於上傳。 XmlHttpRequest不支持它。我真的認爲你需要一個用於上傳的異步控制器,以避免長時間上傳服務器,加上Flash/Java Applet或隱藏的iframe技術。無論你使用什麼,都應該調用一個動作來上傳,另一個來跟蹤進度。 – tvanfosson

+0

在使用你的技術處理這段代碼的時候,我想如果文件上傳到服務器上的一個文件夾,那麼進度條沒問題,否則它不起作用。但是,在這兩種情況下,您都是通過瀏覽器發送(通過瀏覽器上傳)到服務器,因此客戶端正在解釋數據,因此文件存儲在文件夾或內存流中真的很重要嗎? – Spitfire