zoukankan      html  css  js  c++  java
  • HTTP断点续传下载的原理

    frombegintoend原文HTTP断点续传下载的原理

    要实现断点续传下载文件,首先要了解断点续传的原理。断点续传其实就是在上一次下载断开的位置开始继续下载,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  
    
  • 相关阅读:
    Python 模块的安装与使用
    Python——list切片
    IPv4与IPv6数据报格式
    计算机网络——网络层
    大型网站技术
    mysql主从复制数据库
    Laravel-安装composer
    centos7 yum安装配置redis
    最新cenos执行service httpd restart 报错Failed to restart httpd.service: Unit not found.
    Memcache安装
  • 原文地址:https://www.cnblogs.com/arxive/p/6147157.html
Copyright © 2011-2022 走看看