C# MVC5将大文件上载到DB System.OutOfMemoryException

C# MVC5将大文件上载到DB System.OutOfMemoryException,c#,asp.net-mvc,file-upload,C#,Asp.net Mvc,File Upload,我需要上传潜在的大文件到我们的网站,然后到数据库。但是,每次我实例化存储文件数据的字节[],我都会得到一个立即的System.OutOfMemoryException。该框有足够的ram,但IIS/.Net似乎对进程内存有限制 型号: public class CreateFileModel : IFileModel { ... [ScaffoldColumn(false)] public byte[] FileData { get; set; } ... } 行动

我需要上传潜在的大文件到我们的网站,然后到数据库。但是,每次我实例化存储文件数据的字节[],我都会得到一个立即的System.OutOfMemoryException。该框有足够的ram,但IIS/.Net似乎对进程内存有限制

型号:

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

[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];

您将如何解决此问题?

您可以在IIS中增加应用程序池的专用内存限制大小。这将向您展示如何做到这一点

其次,你的文件有多大


你能把它们分割成更小的文件,然后在服务器端合并吗?

我想支持4GB,但我认为1GB是最低限度可以接受的。至于chunking文件,我仍然需要重新组合它们以填充model字段,以便将它们放入DB,因此我始终需要能够创建一个缓冲区,在将它们插入DB之前将它们组合在一起。或者你有什么办法来解决这个问题吗?你有没有理由不想用FTP将文件上传到服务器上?这篇文章中还建议了另一种方法来帮助您,上传不是问题,而是创建一个缓冲区来保存数据,然后将其插入数据库。恐怕我看不出使用FTP会如何改变这一点。我错过什么了吗?设置AppPool内存可能会有所帮助,但我仍在试图弄清楚如何在我的开发工作站上的IISExpress中配置它。有什么提示吗?直接将文件上传到数据库是一种不好的做法。相反,请保存到文件夹并将路径添加到数据库中。这将涉及重写应用程序的大块,事实上,不鼓励维护链接到数据的大型文件层次结构,因为跨数据库和文件系统维护数据的完整性是一项重要任务。