下载功能大的文件大小失败 [英] Download function failing with big file sizes

查看:326
本文介绍了下载功能大的文件大小失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我下载的功能。

Hi my download function.

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();
}

在处理文件大小20,200MB没有问题的。

When handling filesize of 20, 200mb no problem.

在处理1GB的文件,则抛出异常:

When handling 1gb file, an exception is thrown:

溢出或下溢在算术运算。

Overflow or underflow in the arithmetic operation.

说明:当前Web请求的执行过程中发生未处理的异常。请查看有关错误的详细堆栈跟踪信息,以及它起源于code。

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

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

Exception Details: System.ArithmeticException: Overflow or underflow in the arithmetic operation.

怎么办?

推荐答案

我的猜测是,你正在运行内存在 byte []数组

My guess is that you're running out of memory in the byte[] array.

您可以尝试打破文件下来,读它的块。

You can try breaking the file down and reading it in chunks.

我发现了一个code例如从谷歌搜索,让你开始:

I found a code example from a Google search to get you started:

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");
        }
    }     
}

这篇关于下载功能大的文件大小失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆