2016-11-28 4 views
-1

Мне нужно загрузить потенциально большие файлы на наш сайт, а затем в базу данных. Однако каждый раз, когда я создаю экземпляр байта [], который хранит данные файла, я получаю немедленное исключение System.OutOfMemoryException. Коробка имеет достаточный барабан, но IIS/.Net, похоже, имеет ограничения на память процесса.MVC5 загрузить большой файл в DB System.OutOfMemoryException

Модель:

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

Так что я пытаюсь выяснить, куда идти отсюда. Я мог бы сохранить файл в файловой системе, используя меньший буфер, но тогда я никогда не смог бы получить его в базе данных.

Как бы вы справились с этой проблемой?

+0

Плохая практика загрузки файлов непосредственно в базу данных. Вместо этого сохраните в папку и добавьте путь к вашей базе данных. –

+0

Это потребует перезаписи больших блоков приложения, и на самом деле не рекомендуется поддерживать большие иерархии файлов, связанные с данными, поскольку это важная задача для поддержания целостности данных в БД и файловой системе. –

ответ

0

Вы можете увеличить размер собственной памяти для пула приложений в IIS это должно показать вам, как это сделать https://www.404techsupport.com/2016/03/iis-wsus-private-memory/

Во-вторых, насколько велики ваши файлы ??

Можете ли вы разделить их на более мелкие файлы, которые затем объединены на серверной стороне?

+0

Я хотел бы поддержать до 4 ГБ, но я думаю, что 1 ГБ минимально приемлемо. Что касается chuncking файлов, мне все равно нужно их собрать, чтобы заполнить поле модели, чтобы получить их в БД, поэтому мне всегда нужно будет создать буфер, в котором они будут объединены, прежде чем они смогут быть вставлены в DB. или у вас есть идея обойти это? –

+0

Есть ли причина, по которой вы не хотите, чтобы FTP загружал файлы на сервер? Существует еще один способ, предложенный здесь в этом сообщении, чтобы помочь вам http://stackoverflow.com/questions/17527365/memory-usage-if-upload-big-file-in-one-request-in-iis – Fuzzybear

+0

ну, загрузка не проблема, а вместо этого создание буфера для хранения данных, чтобы затем его можно было вставить в БД. Боюсь, я не понимаю, как это изменит использование FTP. Мне что-то не хватает? Установка памяти AppPool может помочь, но я все еще пытаюсь понять, как вы настраиваете это в IISExpress на моей рабочей станции разработки. Любые намеки на это? –