2013-06-03 176 views
2

上傳84MB文件(請參見下面的錯誤)時出現此錯誤,但是當我上載〜60MB文件時,它正常工作。這隻發生在我們的32位2008 VM VM/4GB內存上。在我的R2 64bit VM w/8GB內存上,即使130MB文件也可以正常工作。System.OutOfMemoryException:上傳文件時出現異常

System.OutOfMemoryException:異常的類型 'System.OutOfMemoryException'被拋出。在 Ç System.IO.BinaryReader.ReadBytes(的Int32計數)在 CustWeb.Controllers.DownloadsController.Create(下載DL, HttpPostedFileBase文件):\ ... \ CustWeb \ \控制器DownloadsController.cs:行72

但是,我在任務管理器中監視了內存,在整個上傳過程中,它始終沒有超過74%。

這是4.5 .NET框架中的MVC 4應用程序。

我有我的web.config中處理上傳文件的最大設置。

<httpRuntime requestValidationMode="4.5" targetFramework="4.5" maxRequestLength="2147483647" executionTimeout="84000" /> 

...

<security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="2147482624" /> 
    </requestFiltering> 
</security> 

UPDATE的要求添加代碼:

public ActionResult Create(Download dl, HttpPostedFileBase file) 
    { 
     try 
     { 
      using (var binaryReader = new BinaryReader(file.InputStream)) 
      { 
       dl.FileBytes = binaryReader.ReadBytes(file.ContentLength); 
      } 
      dl.FileContentType = file.ContentType; 
      dl.FileName = file.FileName; 
      dl.Insert(); 
      Success("<strong>" + dl.Label + "</strong> created and uploaded successfully."); 
      return RedirectToAction("Index"); 
     } 
     catch (Exception ex) 
     { 
      SelectList list = new SelectList(new DownloadType().GetDownloadTypes(), "ID", "Name"); 
      ViewBag.DownloadTypeList = list; 
      Error(ex.ToString()); 
      return View(dl); 
     } 
    } 
+0

向我們顯示您的代碼。 – SLaks

+0

這裏使用'BinaryReader'是錯誤的。 – leppie

+0

@SLaks - 按照您的要求添加了我的代碼。 – RichC

回答

0

我改變它從流到file.SaveAs,並防止內存錯誤。

public ActionResult Create(Download dl, HttpPostedFileBase file) 
    { 
     try 
     { 
      string tempFile = Path.Combine(Server.MapPath("~/App_Data/"), string.Format("{0}_{1}",Guid.NewGuid().ToString(), Path.GetFileName(file.FileName))); 
      file.SaveAs(tempFile); 
      dl.FileBytes = System.IO.File.ReadAllBytes(tempFile); 
      dl.FileContentType = file.ContentType; 
      dl.FileName = file.FileName; 
      dl.Insert(); 
      System.IO.File.Delete(tempFile); 
      Success("<strong>" + dl.Label + "</strong> created and uploaded successfully."); 
      return RedirectToAction("Index"); 
     } 
     catch (Exception ex) 
     { 
      SelectList list = new SelectList(new DownloadType().GetDownloadTypes(), "ID", "Name"); 
      ViewBag.DownloadTypeList = list; 
      Error(ex.ToString()); 
      return View(dl); 
     } 
    } 
+0

我仍然偶爾會出現內存錯誤,但將其更改爲此方法明顯改善了(加倍)我能夠上傳的文件大小。我想,我必須增加實際的內存來做比160MB更好的文件。 – RichC

+0

在做了一些關於這個問題的閱讀之後。我的問題不是上傳文件,而是將它保存到數據庫之前的readAllBytes。它也看起來像是要保存200MB +文件,我應該將它們存儲在文件系統中,並將引用保存到數據庫中。 – RichC

3

默認情況下,ASP.NET允許可用內存的60% - 檢查memoryLimit in processModel in machine.config。你可以改變這個值,比如80%給ASP.NET提供更多的空間,但這不推薦。考慮其他選項,如上傳文件塊等

+0

哇 - 你如何上傳大塊文件? – RichC

+0

使用HTTP模塊有不同的方法,例如:http://dotnetslackers.com/Community/blogs/haissam/archive/2008/09/12/upload-large-files-in-as-net-using-httpmodule.aspx使用第三方控件,例如http://www.plupload.com/。但即使在嘗試使用上面顯示的web.config的httpRuntime節的requestLengthDiskThreshold屬性之前。它控制服務器在將內容緩存到磁盤之前可以保存在上載文件中的大小。 –

+0

默認情況下顯示爲256字節以防止使用太多的內存。它似乎增加它會使用更多的內存,並使問題變得更糟,不是嗎? – RichC

相關問題