要實現斷點續傳下載文件,首先要了解斷點續傳的原理。斷點續傳其實就是在上一次下載斷開的位置開始繼續下載,HTTP協議中,可以在請求報文頭中加入Range段,來表示客戶機希望從何處繼續下載。
這是一個普通的下載請求:
GET /test.txt HTTP/1.1 Accept:*/* Referer:http://192.168.1.96 Accept-Language:zh-cn Accept-Encoding:gzip,deflate User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 2.0.50727) Host:192.168.1.96 Connection:Keep-Alive
這表示從1024字節開始斷點續傳(加入了Range:bytes=1024-):
GET /test.txt HTTP/1.1 Accept:*/* Referer:http://192.168.1.96 Accept-Language:zh-cn Accept-Encoding:gzip,deflate User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 2.0.50727) Host:192.168.1.96 Range:bytes=1024- Connection:Keep-Alive
C#主要代碼:
#region 以斷點續傳方式下載文件
/// <summary>
/// 以斷點續傳方式下載文件
/// </summary>
/// <param name="strFileName">下載文件的保存路徑</param>
/// <param name="strUrl">文件下載地址</param>
public void DownloadFile(string strFileName, string strUrl)
{
//打開上次下載的文件或新建文件
long SPosition = 0;
FileStream FStream;
if (File.Exists(strFileName))
{
FStream = File.OpenWrite(strFileName);
SPosition = FStream.Length;
FStream.Seek(SPosition, SeekOrigin.Current);//移動文件流中的當前指針
}
else
{
FStream = new FileStream(strFileName, FileMode.Create);
SPosition = 0;
}
try
{
HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(strUrl);
if (SPosition > 0)
myRequest.AddRange((int)SPosition);//設置Range值
//向服務器請求,獲得服務器的回應數據流
Stream myStream = myRequest.GetResponse().GetResponseStream();
byte[] btContent = new byte[512];
int intSize = 0;
intSize = myStream.Read(btContent, 0, 512);
while (intSize > 0)
{
FStream.Write(btContent, 0, intSize);
intSize = myStream.Read(btContent, 0, 512);
}
FStream.Close();
myStream.Close();
//文件下載完成
}
catch
{
FStream.Close();
}
}
#endregion
