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);//将临时文件改为正常文件后缀

}

}

 


 

 
posted on 2014-05-19 17:10  柚子代码  阅读(1217)  评论(0)    收藏  举报