首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用FileStream ASPNET发送大文件500MB时出现OutOfMemoryException

关于使用 FileStream ASPNET 发送大文件 500MB 时出现 OutOfMemoryException 的问题,我们可以从以下几个方面来解决:

  1. 优化内存分配:

在处理大文件时,可以通过调整内存分配来避免内存不足的问题。可以尝试使用 GC.Collect() 方法来强制垃圾回收,以释放内存空间。

  1. 分块传输:

可以使用分块传输的方式来处理大文件,将文件分成多个较小的部分,每次只传输一部分。这可以通过设置 Response.BufferOutput 属性为 false 来实现。

  1. 使用 FileStream 类:

可以使用 FileStream 类来读取文件,并将文件的内容逐块写入响应流中。这样可以避免一次性将整个文件加载到内存中。

示例代码:

代码语言:csharp
复制
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);
        }
    }
}
  1. 使用 HttpResponse.TransmitFile 方法:

可以使用 HttpResponse.TransmitFile 方法来处理大文件,该方法可以将文件的内容直接写入响应流中,而不需要将整个文件加载到内存中。

示例代码:

代码语言:csharp
复制
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 方法来实现分块传输。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【深入浅出C#】章节 7: 文件和输入输出操作:处理文本和二进制数据

    文件和输入输出操作在计算机编程中具有重要性,因为它们涉及数据的持久化存储和交互。数据可以是不同类型的,例如文本、图像、音频、视频和二进制数据。这些不同类型的数据具有不同的存储需求。 文本数据是最常见的数据类型之一,用于存储和传输可读的字符信息。文本文件在配置文件、日志记录和文档中广泛使用。处理文本数据需要关注字符编码和解码,确保数据在不同系统之间正确地传递 二进制数据则是以字节为单位存储的数据,适用于存储非文本数据,如图像、音频和视频。由于这些数据的特殊性,需要特定的读写方式来确保数据的正确性和完整性。 不同类型数据的存储需求不同。文本数据需要考虑字符编码、换行符等。二进制数据需要考虑字节顺序、文件结构等。了解如何处理不同类型的数据能够帮助开发人员有效地进行文件读写和输入输出操作,从而满足应用程序的需求。

    08

    asp.net下载文件几种方式

    { /* 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。 代码如下: */ Response.ContentType = "application/x-zip-compressed"; Response.AddHeader("Content-Disposition", "attachment;filename=z.zip"); string filename = Server.MapPath("DownLoad/aaa.zip"); Response.TransmitFile(filename); } //WriteFile实现下载 protected void Button2_Click(object sender, EventArgs e) { /* using System.IO; */ string fileName ="aaa.zip";//客户端保存的文件名 string filePath=Server.MapPath("DownLoad/aaa.zip");//路径 FileInfo fileInfo = new FileInfo(filePath); Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); Response.AddHeader("Content-Length", fileInfo.Length.ToString()); Response.AddHeader("Content-Transfer-Encoding", "binary"); Response.ContentType = "application/octet-stream"; Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); Response.WriteFile(fileInfo.FullName); Response.Flush(); Response.End(); } //WriteFile分块下载 protected void Button3_Click(object sender, EventArgs e) { string fileName = "aaa.zip";//客户端保存的文件名 string filePath = Server.MapPath("DownLoad/aaa.zip");//路径 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); if (fileInfo.Exists == true) { const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力 byte[] buffer = new byte[ChunkSize]; Response.Clear(); System.IO.FileStream iStream = System.IO.File.OpenRead(filePath); long dataLengthToRead = iStream.Length;//获取下载的文件总大小 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName)); while (dataLengthToRead > 0 && Response.IsClientConnected) { int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小 Response.OutputStream.Write(buffer, 0, lengthRead); Response.Flush(); dataLengthToRead = dataLengthToRead - lengthRead; } Response.Close(); } } //流方式下载 protected void Button4_Click(object sender, Eve

    02

    【深入浅出C#】章节 7: 文件和输入输出操作:文件读写和流操作

    文件读写在计算机编程中起着至关重要的作用,它允许程序通过读取和写入文件来持久化数据,实现数据的长期保存和共享。文件读写是许多应用程序的核心功能之一,无论是创建文本文件、二进制文件,还是处理配置文件、日志文件或数据库文件,文件读写都是不可或缺的部分。 文件读写的基本概念是通过输入和输出操作来与计算机上的文件进行交互。读取文件允许程序从文件中获取数据,以供后续处理和分析;而写入文件则允许程序将数据存储到文件中,以备后续使用或共享给其他应用程序。通过文件读写,程序可以在不同的运行实例之间共享数据,也可以实现数据的持久化,使得数据在程序关闭后仍能保留。 文件读写的用途广泛,包括但不限于:

    05
    领券