你的位置:首页 > ASP.net教程

[ASP.net教程]HTTP协议断点续传


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;

namespace HttpDemo
{
    class Program
    {
        //需要下载的路径
        static string url = "http://www.aseoe.com/demo/api/jquery_aseoe_001.zip";
        //获取文件全称
        static string fileName = Path.GetFileName(url);
        //保存路径
        static string localPath = "D:\\HttpCeShi\\" + fileName;
        //未下载完后面加.temp后缀名
        static string tempPath = localPath + ".temp";
        //偏移量(断点)
        static int pos;

        static void Main(string[] args)
        {
            DownLoad();
            Console.ReadLine();
        }
        public static void DownLoad()
        {
            //如果存在要更新的文件就结束
            if (File.Exists(localPath))
                return;

            Stream localfs = null;
            //如果不存在未上传完文件(需断点续传文件)
            if (File.Exists(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;
            //文件总长度单位(B)
            long total = request.GetResponse().ContentLength;
            Console.WriteLine("总长度为:" + total);
            if (pos > 0)
                request.AddRange(pos);//偏移到断点

            HttpWebResponse responseResult = (HttpWebResponse)request.GetResponse();
            using (Stream stream = responseResult.GetResponseStream())
            {
                byte[] buffer = new byte[total - pos];

                int readSize = stream.Read(buffer, 0, buffer.Length);
                while (readSize > 0)
                {
                    localfs.Write(buffer, 0, readSize);
                    readSize = stream.Read(buffer, 0, buffer.Length);
                    Console.WriteLine("已下载:" + localfs.Length);
                }
                localfs.Close();
                File.Move(tempPath, localPath);//将临时文件改为正常文件后缀
                Console.WriteLine("下载完成!!!");
            }

        }


    }
}