2009-11-24 23 views
0

我已經注意到這個沒有問過,所以我要問這個問題?沒有裝載上傳文件到ram在asp.net mvc的

目前我寫的上傳控制器上傳一些相當大的文件。但我注意到,當把它上傳大文件,CPU和RAM走高峯,這真的不是我想做的(當然你也行)

我的控制器看起來像:

int Count = 0; 
     string _uploadsFolder = HostingEnvironment.MapPath("~/Upload/Files/Images/"); 

     for (int i = 0; i < Request.Files.Count; i++) 
     { 
      HttpPostedFileBase _file = Request.Files[i]; 

      // Validation ...... 
      FileMIME mimetype = new FileMIME(); 
      mimetype.AllowedMimeTypes.Add("image/png"); 
      mimetype.AllowedMimeTypes.Add("image/jpeg"); 
      mimetype.AllowedMimeTypes.Add("image/gif"); 

      if ((_file.ContentLength > 0) && (_file.ContentLength < 4194304) && (mimetype.IsImage(_file))) 
      { 
       string guid = Guid.NewGuid().ToString(); 
       string _fileLocation = Path.Combine(_uploadsFolder, Path.GetFileName(_file.FileName)); 

       _file.SaveAs(_fileLocation); 

       Count++; 
      } 
     } 

反正是有使這個緩衝區進入硬盤而不是內存?

非常感謝你......

+0

什麼是客戶端應用程序?我認爲IIS可以處理HTTP PUT,我相信這會佔用更少的資源。 – 2009-11-24 02:15:38

+0

是的,目前即​​時使用IIS – DucDigital 2009-11-24 03:35:06

回答

0

我不知道是肯定的,但它是如何將得到的硬盤驅動器,而無需使用CPU和RAM?似乎服務器需要通過RAM處理流以便將其寫入硬盤。

+0

像緩存到Hardisk而不是RAM,目前,程序將所有內容(1GB文件)加載到ram中,然後保存到硬盤中。有時我的MVC應用程序鎖定 – DucDigital 2009-11-24 03:35:59

0

如果這從一個網頁來了,然後把它說從客戶端計算機到您的服務器你將需要流加載到內存中。我認爲沒有辦法解決這個問題。

可能有辦法減輕服務器的負載。您可能能夠做到異步,讓用戶相對自由地繼續。

您可以處理成塊,而數據流並一次全部。

有可能是別人,但所有這些仍然會使用RAM。

看起來像你可能正在接受圖像。您可以在保存到數據庫之前調整內存中的圖像大小,一旦您擁有了該文件,這將減少將來在RAM上的任何負載,但同樣,當您上傳文件時會使用RAM。

的(唯一的)其他的方式,和一個這是非常bizare,可能是允許用戶將文件FTP到你的網站,然後你引用該文件在一個表中的條目。

你甚至可以,雖然我從來沒有嘗試通過您的Web應用程序做到這一點。

+0

我認爲這樣做是不是真的更多鈔票異步(底座上我的理解),因爲RAM和CPU去峯用戶將數據上傳到我的服務器,因此如果用戶更改頁面,ofcoure取消操作,不是嗎? – DucDigital 2009-11-24 03:37:39

+0

是的,就像我說過的,我認爲這實際上不會解決您的問題。我只是不認爲這個@DucDigital有什麼辦法。您將文件從一臺計算機傳輸到另一臺計算機的事實意味着您需要使用某種類型的流並使用ram。限制文件的大小將是我的建議。這樣RAM的使用不會很大,處理時間也會減少。 – griegs 2009-11-24 04:05:49

+0

但atlease我看到了一些在.NET asembly支付處理這些事情,我認爲.NET能夠緩存文件上傳到磁盤的,只是目前我不知道如何:) – DucDigital 2009-11-24 07:28:42