2016-11-28 77 views
-1

我需要上傳潛在的大文件到我們的網站,然後到數據庫中。但是,每次我實例化存儲文件數據的byte []時,都會立即得到System.OutOfMemoryException。該框具有足夠的內存,但IIS/.Net似乎對進程內存有限制。MVC5上傳大文件到DB System.OutOfMemoryException

型號:

public class CreateFileModel : IFileModel { 
... 
     [ScaffoldColumn(false)] 
     public byte[] FileData { get; set; } 
... 
} 

POST操作:

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult CreateFile(CreateFileModel model) { 
      try { 

      if (ModelState.IsValid && Request != null && Request.Files.Count > 0) { 

       foreach (string uploadname in Request.Files) { 
        HttpPostedFileBase uploadedFile = Request.Files[uploadname]; 
        if (uploadedFile?.ContentLength > 0) { 
         model.FileData = new byte[uploadedFile.ContentLength]; // <-- BREAKS HERE WITH OutOfMemoryException 
         uploadedFile.InputStream.Read(model.FileData, 0, Convert.ToInt32(uploadedFile.ContentLength)); 
        } 
       } 

       if (model.FileData.Length > 0) { 
        FileMapper mapper = new FileMapper(); 
        mapper.Create(model); 

        return RedirectToAction("Index", "Index", new { pucoId = CurrentUser.PUCOID, folderId = CurrentDirectoryId }); 
       } 
      } 

      } 
      catch (Exception ex) { 
      OnError(ex); 
      } 

      model.FileData = null; 
      return View(model); 
     } 

    } 

錯誤實例化的模型,該模型將被用於更新數據庫接收緩衝區時,總是會發生的。

model.FileData = new byte[uploadedFile.ContentLength]; 

所以我想弄清楚從哪裏去。我可以使用較小的緩衝區將文件保存到文件系統,但是我實際上永遠無法將它們存入數據庫。

你會如何解決這個問題?

+0

是不好的做法,直接上傳文件到數據庫。相反,保存到一個文件夾並將路徑添加到您的數據庫。 –

+0

這將涉及重寫應用程序的大塊,事實上,維護與數據鏈接的大型文件層次結構是不鼓勵的,因爲維護數據庫和文件系統中數據的完整性是一項重要任務。 –

回答

0

可以增加專用空間限制的大小在IIS應用程序池這應該告訴你如何做到這一點https://www.404techsupport.com/2016/03/iis-wsus-private-memory/

其次,有多大的文件?

你可以把它們分成更小的文件,然後在服務器端進行組合?

+0

我想支持高達4GB,但我認爲1GB是最低限度可以接受的。至於chuncking文件,我仍然需要重新組裝它們以填充模型字段以便將它們放入數據庫中,所以我將始終需要能夠創建一個緩衝區,以便在它們可以插入到D B。或者你有任何想法來解決這個問題? –

+0

是否有一個原因,你不想FTP上傳文件到服務器?這裏有另一種方式在這篇文章中建議可能能夠幫助你http://stackoverflow.com/questions/17527365/memory-usage-if-upload-big-file-in-one-request-in-iis – Fuzzybear

+0

上傳不是問題,而是創建一個緩衝區來保存數據,以便將其插入到數據庫中。恐怕我不明白如何使用FTP會改變這一點。我錯過了什麼?設置AppPool內存可能會有所幫助,但我仍然試圖弄清楚如何在我的開發工作站的IISExpress中配置它。任何提示? –