1、最常用的下载方式是找到文件下载路径, 直接下载了, 这种直接形式从硬盘下载文件,大文件下载速度比较慢。
2、利用HTTP输出二进制流实现下载文件,速度是够快,不过同样缺陷在于下载大文件时,因为需要一次性的根据文件大小来分配相应的内存,如果文件超大, 内存空间不够。
3、利用HTTP分块下载,即不一次性分配存放下载文件的内存,而采用一次只分配10M或者其他值的内存,然后这样来实现分块下载。
代码如下:
System.IO.FileInfo fileInfo = new System.IO.FileInfo(fullName);
if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//100K
byte[] buffer = new byte[ChunkSize];
Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(fullName);
// ファイルサイズ
long dataLengthToRead = iStream.Length;
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Length", dataLengthToRead.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename));
long position = 0;
int cnt = 0;
while (position < dataLengthToRead && Response.IsClientConnected)
{
cnt++;
// 传输100M后关闭一次stream,如果不关闭,使用内存会一直增长。
if (cnt > 1000)
{
iStream.Close();
iStream = System.IO.File.OpenRead(fullName);
cnt = 0;
}
iStream.Seek(position, SeekOrigin.Begin);
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
position = iStream.Position;
}
Response.Close();
iStream.Close();
}