zoukankan      html  css  js  c++  java
  • 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
    

      

    本博客(liqipeng)除非已明确说明转载,否则皆为liqipeng原创或者整理,转载请保留此链接:https://www.cnblogs.com/liqipeng/archive/2013/06/02/4576170.html

    本博客(liqipeng)除非已明确说明转载,否则皆为liqipeng原创或者整理,转载请保留此链接:https://www.cnblogs.com/liqipeng/archive/2013/06/02/4576170.html
    如果你觉得这篇文章对你有帮助或者使你有所启发,请点击右下角的推荐按钮,谢谢,:)
  • 相关阅读:
    【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行
    【刷题】BZOJ 4650 [Noi2016]优秀的拆分
    【刷题】BZOJ 4566 [Haoi2016]找相同字符
    【刷题】BZOJ 3238 [Ahoi2013]差异
    微信公众号_订阅号_被动回复用户消息
    艺术模板 art-template-web
    AJAX_违反了同源策略_就是"跨域"——jsonp 和 cors
    Ajax_简介: 异步的 JS 和 XML_原生写 ajax 分析其原理_jquery_ajax_art-template
    Node.js_express_临时会话对象 session
    BOM 浏览器对象模型_XMLHttpRequest 对象
  • 原文地址:https://www.cnblogs.com/liqipeng/p/4576170.html
Copyright © 2011-2022 走看看