HTTP 协议一下断点续传的原理
c# 、.net、 HTTP文件传输、断点续传
当用在下载文件时尤其是大文件时,不希望因各种原因如:暂停下载,网络异常,或各种误操作导致下载中断而需重新下载该文件。接下来介绍的是在HTTP协议下,如何实现断点的续传。
在介绍断点续传之前,先简单了解一下什么是HTTP:
HTTP是最为常用的网络传输协议之一,HTTP协议是一种基于tcp的简单协议,分为请求(Request)和回复(Response)两种。
1、如何从断点处开始下载:System.Net.HttpWebRequest 这个对象有个AddRange(int pos)方法,该方表示在文件长度pos处开始下载。
2、如何找到本地已经下载部分的文件断点(上述参数pos):使用对FielStream fs= New FileStream(path, FileMode.Open)打开文件,则断点位置即为pos=fs.Length;
3、如何在文件断点结尾处写入(从网络下载)数据流:fs.Seek(pos, SeekOrigin.Current);
4、如何保存文件:当文件还未下载完时,我们在文件末尾追加个.temp后缀,当http的流读完时我们使用File.Move(xx.zip.temp,xx.zip);//将临时文件改为正常文件后缀
实例参考:(临时写的案例,未调试,可能会有部分命名错误,但是大至意思如下)
string url=http://192.168.0.x:test.zip;
string fileName = Path.GetFileName(url);
string localPath="D:\\"+fileName;
string tempPath=localPath+".temp";
int pos;
public void DownLoad()
{
if(File.Exists(localPath))
return;
Stream localfs=null;
if(!File.Exist(tempPath)
{
localfs= new FileStream(tempPath, FileMode.Open);
}
else
{
localfs= new FileStream(tempPath, FileMode.Create) ;
}
pos=(int)localfs.length;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add("Accept-Charset", "GBK,utf-8");
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
request.Method = "GET";
request.Timeout = 30000;
if (pos> 0)
request.AddRange(pos);//偏移到断点
HttpWebResponse responseResult = (HttpWebResponse)request.GetResponse();
using (Stream stream = responseResult.GetResponseStream())
{
byte[] buffer = new byte[1024 * 8];
int readSize = stream.Read(buffer, 0, buffer.Length);
while (readSize > 0)
{
localfs.Write(buffer, 0, readSize);
}
localfs.Close();
File.Move(tempPath, localPath);//将临时文件改为正常文件后缀
}
}
浙公网安备 33010602011771号