断点下载与普通下载无非是请求时通过Range参数提交本地文件大小,其实现主要有以下两个条件:
1、服务器支持Range协议,目前大部分的Http服务器都是支持Range协议的,可以通过curl或wget去测试。
2、本地程序请求时加入Range参数。
//断点下载功能 public void DownLoad(object obj) { long curLen = 0; string uri = obj.ToString(); //截取文件名 string fileName = HttpUtility.UrlDecode(uri.Substring(uri.LastIndexOf(@"/") + 1)); //string fileName =uri.Substring(uri.LastIndexOf(@"/") + 1); //构造文件完全限定名,准备将网络流下载为本地文件 string fileFullName = @"d:\" + fileName; string fileTmpName = @"d:\" + fileName+".tmp"; //本地构造文件流 FileStream fs; if (File.Exists(fileFullName)) { return; } if (File.Exists(fileTmpName)) { fs = new FileStream(fileTmpName, FileMode.Append, FileAccess.Write, FileShare.Write); //fsCfg = fs = new FileStream(fileTmpName, FileMode.Append, FileAccess.Write, FileShare.Write); } else { fs = new FileStream(fileTmpName, FileMode.Create); } //请求地址 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); //请求开始位置 request.AddRange((int)fs.Length); //已下载的本地文件大小 curLen = fs.Length; //获取网络流 Stream ns = request.GetResponse().GetResponseStream(); //获取文件实际要下载的大小 long contentLength = request.GetResponse().ContentLength; //文件总大小=本地文件大小+下载文件大小 long totalLen = fs.Length + contentLength; //开辟内存空间 byte[] buffer = new byte[512]; //获取文件读取到的长度 int length = ns.Read(buffer, 0, buffer.Length); while (length > 0) { //将字节数组写入流 fs.Write(buffer, 0, length); //当前文件大小 curLen += length; //progressText = curLen + "/" + totalLen; //progress = Convert.ToInt32((curLen * 100) / totalLen); //继续下载 buffer = new byte[512]; length = ns.Read(buffer, 0, buffer.Length); } ns.Close(); ns.Dispose(); fs.Close(); fs.Dispose(); File.Move(fileTmpName, fileFullName); }
浙公网安备 33010602011771号