[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 回應大型檔案