我有一个大型zip文件(500MB或更高),我正在读取MemoryStream并作为FileStreamResult返回。但是,我收到的文件超过200MB的OutOfMemory异常。在我的Action中,我有以下代码:
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);
答案 0 :(得分:2)
您可以尝试本页提出的解决方案:
OutOfMemoryException when sending a big file 500mb using filestream
它显示了如何将文件读入IStream
并发送响应。
答案 1 :(得分:2)
如果您将文件读入MemoryStream,您仍然需要为整个文件分配内存,因为MemoryStream内部只是一个字节数组。
所以目前你正在使用较小的中间(也在内存中)缓冲区将文件读入大内存缓冲区。
为什么不直接将文件流转发到FileStreamResult?
using (var fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
return new FileStreamResult(fs, content_type);
}