2016-11-28 95 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中配置它。任何提示? –