0

我有一个大 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);
4

2 回答 2

2

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

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

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

using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
    return new FileStreamResult(fs, content_type); 
}
于 2012-04-04T14:47:56.893 回答
2

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

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

它显示了如何将文件读入IStream并发送响应。

于 2012-04-04T14:38:39.380 回答