[ASP.NET]回應大型檔案下載

[ASP.NET] 回應大型檔案下載

檔案下載, 大家應該寫的很多, 但是超過2G以上的檔案下載, 就不太容易了

在這邊提供一下解決方案

 Stream iStream = null;

                byte[] buffer = new Byte[10000];
                int length;
                long dataToRead;
                if (File.Exists(filepath + filename))
                {
                    try
                    {
                        DoLog(filename);

                        iStream = new FileStream(filepath + filename, FileMode.Open, FileAccess.Read, FileShare.Read);

                        dataToRead = iStream.Length;
                        Response.ContentType = "application/octet-stream";
                        Response.ContentEncoding = Encoding.UTF8;
                        Response.Charset = "utf-8";

                        if (Request.Browser.Browser.ToUpper() == "IE")
                        {
                            Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, Encoding.UTF8));
                        }
                        else
                        {
                            Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
                        }

                        Response.AddHeader("Content-Length", iStream.Length.ToString());

                        while (dataToRead > 0)
                        {
                            if (Response.IsClientConnected)
                            {
                                length = iStream.Read(buffer, 0, 10000);
                                Response.OutputStream.Write(buffer, 0, length);
                                Response.Flush();

                                buffer = new Byte[10000];
                                dataToRead = dataToRead - length;
                            }
                            else
                            {
                                dataToRead = -1;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Alert("Default.aspx", "無法下載檔案!");
                    }
                    finally
                    {
                        if (iStream != null)
                        {
                            iStream.Close();
                        }
                    }
                }
                else
                {
                    Alert("Default.aspx", "檔案不在伺服器上!");
                }

 

這邊要注意, 超過4GB的檔案, 會因為瀏覽器限制無法下載完成, 所已超過或等於4GB的檔案可能需要切割分開下載然後在合併

 

參考資料

Will保哥寫的ASP.NET 回應大型檔案