下载功能失败,文件大小过大

本文关键字:文件大小 功能 失败 下载 | 更新日期: 2023-09-27 18:25:53

嗨,我的下载功能。

protected void downloadFunction(string fileName)
{
    string filePath = @"D:'SoftwareFiles'";
    LogMessageToFile("Download started " + filePath + fileName);
    byte[] array = File.ReadAllBytes(filePath + fileName);
        
    Response.Clear();
    Response.ContentType = "application/x-newton-compatible-pkg";
    Response.AppendHeader("Content-Disposition", 
                          "attachment;filename=" + fileName);
    Response.BinaryWrite(array);
    Response.End();
}

当处理20mb的文件大小时没有问题。

当处理1gb文件时,抛出一个异常:

算术运算中的上溢或下溢。

描述:在执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误以及错误在代码中的来源的更多信息。

异常详细信息:System.ArithmeticException:算术运算中的溢出或下溢。

该怎么办?

下载功能失败,文件大小过大

我的猜测是byte[] array中的内存不足。

你可以试着把文件分解成块来读。

我从谷歌搜索中找到了一个代码示例,让你开始:

C#文件下载程序AKA Response.BinaryWrite

using System;
using System.IO;
using System.Web;
public class Download
{
    public static void SmallFile(string filename, string filepath, string contentType)
    {
        try
        {
            FileStream MyFileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read);
            long FileSize;
            FileSize = MyFileStream.Length;
            byte[] Buffer = new byte[(int)FileSize];
            MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length);
            MyFileStream.Close();
            HttpContext.Current.Response.ContentType = contentType;
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
            HttpContext.Current.Response.BinaryWrite(Buffer);             
        }
        catch
        {
            HttpContext.Current.Response.ContentType = "text/html";
            HttpContext.Current.Response.Write("Downloading Error!");
        }
        HttpContext.Current.Response.End();
    }
    public static void LargeFile(string filename, string filepath, string contentType)
    {
        Stream iStream = null;
        // Buffer to read 10K bytes in chunk
        //byte[] buffer = new Byte[10000];
        // Buffer to read 1024K bytes in chunk
        byte[] buffer = new Byte[1048576];
        // Length of the file:
        int length;
        // Total bytes to read:
        long dataToRead;
        try
        {
            // Open the file. 
            iStream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read);
            // Total bytes to read:
            dataToRead = iStream.Length;
            HttpContext.Current.Response.ContentType = contentType;
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
            // Read the bytes.
            while (dataToRead > 0)
            {
                // Verify that the client is connected.
                if (HttpContext.Current.Response.IsClientConnected)
                {
                    // Read the data in buffer.
                    length = iStream.Read(buffer, 0, 10000);
                    // Write the data to the current output stream.
                    HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);
                    // Flush the data to the HTML output.
                    HttpContext.Current.Response.Flush();
                    buffer = new Byte[10000];
                    dataToRead = dataToRead - length;
                }
                else
                {
                    //prevent infinite loop if user disconnects
                    dataToRead = -1;
                }
            }
        }
        catch (Exception ex)
        {
            // Trap the error, if any.
            //HttpContext.Current.Response.Write("Error : " + ex.Message);
            HttpContext.Current.Response.ContentType = "text/html";
            HttpContext.Current.Response.Write("Error : file not found");                 
        }
        finally
        {
            if (iStream != null)
            {
                //Close the file.
                iStream.Close();
            }
            HttpContext.Current.Response.End();
            HttpContext.Current.Response.Close();             
        }         
    }
    public static void ResumableFile(string filename, string fullpath, string contentType)
    {
        try
        {
            FileStream myFile = new FileStream(fullpath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            BinaryReader br = new BinaryReader(myFile);
            try
            {
                HttpContext.Current.Response.AddHeader("Accept-Ranges", "bytes");
                HttpContext.Current.Response.Buffer = false;
                long fileLength = myFile.Length;
                long startBytes = 0;
                //int pack = 10240; //10K bytes
                int pack = 1048576; //1024K bytes
                if (HttpContext.Current.Request.Headers["Range"] != null)
                {
                    HttpContext.Current.Response.StatusCode = 206;
                    string[] range = HttpContext.Current.Request.Headers["Range"].Split(new char[] { '=', '-' });
                    startBytes = Convert.ToInt64(range[1]);
                }
                HttpContext.Current.Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
                if (startBytes != 0)
                {
                    HttpContext.Current.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength));
                }
                HttpContext.Current.Response.AddHeader("Connection", "Keep-Alive");
                HttpContext.Current.Response.ContentType = contentType;
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
                br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
                int maxCount = (int)Math.Floor((double)((fileLength - startBytes) / pack)) + 1;
                for (int i = 0; i < maxCount; i++)
                {
                    if (HttpContext.Current.Response.IsClientConnected)
                    {
                        HttpContext.Current.Response.BinaryWrite(br.ReadBytes(pack));
                    }
                    else
                    {
                        i = maxCount;
                    }
                }
            }
            catch
            {
                HttpContext.Current.Response.ContentType = "text/html";
                HttpContext.Current.Response.Write("Error : file not found");
            }
            finally
            {
                br.Close();
                myFile.Close();
            }
        }
        catch
        {
            HttpContext.Current.Response.ContentType = "text/html";
            HttpContext.Current.Response.Write("Error : file not found");
        }
    }     
}