ASP MVC FileStreamResult内存不足异常

本文关键字:异常 内存不足 FileStreamResult MVC ASP | 更新日期: 2023-09-27 18:30:04

我有一个大的zip文件(500MB或更大),我正在将其读取到MemoryStream中,并作为FileStreamResult返回。然而,对于超过200MB的文件,我得到了一个OutOfMemory异常。在我的行动中,我有以下代码:

MemoryStream outputStream = new MemoryStream();
using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
   //Response.BufferOutput = false;   // to prevent buffering
   byte[] buffer = new byte[1024];
   int bytesRead = 0;
   while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
   {
      outputStream.Write(buffer, 0, bytesRead);
   }
}
outputStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(outputStream, content_type);

ASP MVC FileStreamResult内存不足异常

您可以尝试此页面上提出的解决方案:

使用文件流发送500mb大文件时出现OutOfMemoryException

它展示了如何将文件读取到IStream中并发送响应。

如果将文件读取到MemoryStream中,则仍然需要为整个文件分配内存,因为在内部,MemoryStream只不过是一个字节数组。

因此,目前您正在使用较小的中间缓冲区(也在内存中)将文件读取到较大的内存缓冲区中。

为什么不将文件流直接转发到FileStreamResult?

using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
    return new FileStreamResult(fs, content_type); 
}