关于使用 FileStream ASPNET 发送大文件 500MB 时出现 OutOfMemoryException 的问题,我们可以从以下几个方面来解决:
在处理大文件时,可以通过调整内存分配来避免内存不足的问题。可以尝试使用 GC.Collect()
方法来强制垃圾回收,以释放内存空间。
可以使用分块传输的方式来处理大文件,将文件分成多个较小的部分,每次只传输一部分。这可以通过设置 Response.BufferOutput
属性为 false
来实现。
FileStream
类:可以使用 FileStream
类来读取文件,并将文件的内容逐块写入响应流中。这样可以避免一次性将整个文件加载到内存中。
示例代码:
public void DownloadFile(string fileName)
{
const int bufferSize = 1024 * 1024; // 1MB
using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, bufferSize))
{
Response.BufferOutput = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", $"attachment; filename={Path.GetFileName(fileName)}");
var buffer = new byte[bufferSize];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, bufferSize)) > 0)
{
Response.BinaryWrite(buffer);
Response.Flush();
Array.Clear(buffer, 0, bufferSize);
}
}
}
HttpResponse.TransmitFile
方法:可以使用 HttpResponse.TransmitFile
方法来处理大文件,该方法可以将文件的内容直接写入响应流中,而不需要将整个文件加载到内存中。
示例代码:
public void DownloadFile(string fileName)
{
Response.BufferOutput = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", $"attachment; filename={Path.GetFileName(fileName)}");
Response.TransmitFile(fileName);
}
总之,处理大文件时需要注意内存分配和分块传输,以避免内存不足的问题。可以使用 FileStream
类或 HttpResponse.TransmitFile
方法来实现分块传输。
领取专属 10元无门槛券
手把手带您无忧上云