zoukankan      html  css  js  c++  java
  • NET(C#):使用HttpWebRequest头中的Range下载文件片段

    HTTP请求包头信息中有一个Range属性可以指定索取部分HTTP请求的文件。在.NET中则通过HttpWebRequest.AddRange方法来定义数据的范围。

    当添加了Range属性的HTTP请求发送后,如果服务器支持该请求,也就是说支持部分数据提取(也是我们常说到的支持断点续传的下载,所谓断点续传的下载就是用一个Range属性来指定没有下载到的范围),那么服务器会返回Partial Content状态值(206代码)。否则会返回OK状态值(200代码)。注意如果服务器支持Range但是HTTP Range请求的范围超出了文件范围,则服务器会返回RequestedRangeNotSatisfiable状态值(416代码)。

    [csharp] view plain copy
     
    1. //+ using System.Net;  
    2. //+ using System.IO;  
    3. static void Main(string[] args)  
    4. {  
    5.     //创建HTTP请求  
    6.     var request = (HttpWebRequest)WebRequest.Create("http://files.cnblogs.com/mgen/mgen_amalon.zip");  
    7.     //从第3个到第12个字节,共10个字节。(0是第一个字节)  
    8.     request.AddRange(2, 11);  
    9.     try  
    10.     {  
    11.         //获取HTTP回应,注意HttpWebResponse继承自IDisposable  
    12.         using (var response = (HttpWebResponse)request.GetResponse())  
    13.         {  
    14.             if(response.StatusCode == HttpStatusCode.OK)  
    15.                 throw new Exception("文件不支持Range部分下载");  
    16.   
    17.             //设置接收信息的缓冲器  
    18.             var bytes = new byte[5000];  
    19.             Console.WriteLine("服务器回应:{0}", response.StatusCode);  
    20.             Console.WriteLine("文件大小:{0}", humanReadableByteCount(response.ContentLength, false));  
    21.   
    22.             //获取回应的Stream(字节流)  
    23.             using (var stream = response.GetResponseStream())  
    24.             using (var outStream = new MemoryStream())  
    25.             {  
    26.                 long recv = 0;  
    27.                 int count;  
    28.                 //读取时注意实际接收数据大小  
    29.                 while ((count = stream.Read(bytes, 0, 5000)) != 0)  
    30.                 {  
    31.                     Console.WriteLine("已经下载:{0}", humanReadableByteCount(recv += count, false));  
    32.                     //将接收数据写入  
    33.                     outStream.Write(bytes, 0, count);  
    34.                 }  
    35.                 //输出下载的内容  
    36.                 Console.WriteLine(BitConverter.ToString(outStream.ToArray()));  
    37.   
    38.             }  
    39.         }  
    40.     }  
    41.     catch (Exception ex)  
    42.     {  
    43.         Console.WriteLine("错误信息:{0}", ex.Message);  
    44.     }  
    45. }  
    46.   
    47. //规格化输出大小的方法  
    48. //代码来自 / Original source  
    49. //http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java  
    50. public static String humanReadableByteCount(long bytes, bool si)  
    51. {  
    52.     int unit = si ? 1000 : 1024;  
    53.     if (bytes < unit) return bytes + " B";  
    54.     int exp = (int)(Math.Log(bytes) / Math.Log(unit));  
    55.     String pre = (si ? "kMGTPE" : "KMGTPE")[exp - 1] + (si ? "" : "i");  
    56.     return String.Format("{0:F1} {1}B", bytes / Math.Pow(unit, exp), pre);  
    57. }  

    中间的十个数据会被下载:

    如果尝试不支持Range部分下载的文件,比如普通HTTP的GET请求指定网址的网页。程序则会输出“文件不支持Range部分下载”。

  • 相关阅读:
    东南亚互联网创业哪些领域比较有前景?
    2021最新最实用.NET Core笔试题附答案
    2021UpdateC#.NET笔试题基础篇
    Ubuntu下 安装MiniGUI
    MiniGUI 如何显示繁体字
    Android 基础一 TextView,Style样式,Activity 传值,选择CheckBox 显示密码
    【玩转开源】BananaPi R2 —— 第一篇 Openwrt安装
    JAVA面对对象(二)——继承、方法的覆写
    JAVA面对对象(一)——封装
    JAVA关键字及作用
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7155554.html
Copyright © 2011-2022 走看看