转自:http://www.mgenware.com/blog/?p=220

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

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

//+ using System.Net;
//+ using System.IO;
static void Main(string[] args)
{
//创建HTTP请求
var request = (HttpWebRequest)WebRequest.Create("http://files.cnblogs.com/mgen/mgen_amalon.zip");
//从第3个到第12个字节,共10个字节。(0是第一个字节)
request.AddRange(, );
try
{
//获取HTTP回应,注意HttpWebResponse继承自IDisposable
using (var response = (HttpWebResponse)request.GetResponse())
{
if(response.StatusCode == HttpStatusCode.OK)
throw new Exception("文件不支持Range部分下载"); //设置接收信息的缓冲器
var bytes = new byte[];
Console.WriteLine("服务器回应:{0}", response.StatusCode);
Console.WriteLine("文件大小:{0}", humanReadableByteCount(response.ContentLength, false)); //获取回应的Stream(字节流)
using (var stream = response.GetResponseStream())
using (var outStream = new MemoryStream())
{
long recv = ;
int count;
//读取时注意实际接收数据大小
while ((count = stream.Read(bytes, , )) != )
{
Console.WriteLine("已经下载:{0}", humanReadableByteCount(recv += count, false));
//将接收数据写入
outStream.Write(bytes, , count);
}
//输出下载的内容
Console.WriteLine(BitConverter.ToString(outStream.ToArray())); }
}
}
catch (Exception ex)
{
Console.WriteLine("错误信息:{0}", ex.Message);
}
} //规格化输出大小的方法
//代码来自 / Original source
//http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java
public static String humanReadableByteCount(long bytes, bool si)
{
int unit = si ? : ;
if (bytes < unit) return bytes + " B";
int exp = (int)(Math.Log(bytes) / Math.Log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE")[exp - ] + (si ? "" : "i");
return String.Format("{0:F1} {1}B", bytes / Math.Pow(unit, exp), pre);
}

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

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

NET(C#):使用HttpWebRequest头中的Range下载文件片段的更多相关文章

  1. android中使用Http下载文件并保存到本地SD卡

    1.AndroidMainfest.xml中设置权限 <uses-permission android:name="android.permission.INTERNET"& ...

  2. 实现在 .net 中使用 HttpClient 下载文件时显示进度

    在 .net framework 中,要实现下载文件并显示进度的话,最简单的做法是使用 WebClient 类.订阅 DownloadProgressChanged 事件就行了. 但是很可惜,WebC ...

  3. java中如何设置下载文件

    如果想要设置某一url为下载文件的方法如下 需要设置文件响应类型,使用response.setContentType,比如jpeg格式的图片.如果想要访问该页面时出现下载保存的窗口,使用respons ...

  4. 在浏览器中从FTP下载文件

    public static class FTPHelper { /// <summary> /// 得到特定FTP目录的文件列表 /// </summary> /// < ...

  5. web页面中a标签下载文件包含中文下载失败的解决

    之前用到的文件下载,文件名都是时间戳的形式或者英文名.下载没有问题.后来附件有中文后写在页面是下面效果,点击下载,下载失败. 对应链接拿出来.是如下效果 之前用了各种其他办法都不理想,比如转义什么的. ...

  6. JavaWeb---设置content-disposition响应头,让浏览器下载文件

    package com.zyz; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServlet ...

  7. web.xml文件中配置<mime-mapping>下载文件类型

    TOMCAT在默认情况下下载.rar的文件是把文件当作text打开,以至于IE打开RAR文件为乱码,如果遇到这种情况时不必认为是浏览器的问题,大多数浏览器应该不会死皮赖脸地把二进制文件当作文本打开,一 ...

  8. .net中 登录 才能下载文件的方法 Response.WriteFile实现下载

    protected void Button2_Click(object sender, EventArgs e) { //可以在这里加是否登录的判断 string fileName = "c ...

  9. servlet 中通过response下载文件

    public class ResponseDemo3 extends HttpServlet { private static final long serialVersionUID = -52329 ...

随机推荐

  1. unittest 几个重要概念

    unittest是一个python版本的junit,junit是java中的单元测试框架,unittest实现了很多junit中的概念,比如我们非常熟悉的test case, test suite等, ...

  2. Eclipse for J2EE+tomcat配置上的一些问题

    之前下载了一个eclipse基础版本,学习之前没有什么感觉不方便的地方,方式学习到web编程时,就出现问题了,因为不支持创建web项目. 于是下载了一个Eclipse for J2EE版本的工具,但是 ...

  3. 读写锁--ReentrantReadWriteLock

    读写锁,对于读操作来说是共享锁,对于写操作来说是排他锁,两种操作都可重入的一种锁.底层也是用AQS来实现的,我们来看一下它的结构跟代码: ------------------------------- ...

  4. iOS 系统架构及常用框架(iOS的系统架构分为四个层次)

    1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer).媒体层(Media l ...

  5. jsp模板添加URL定位语句

    html的head头中加入以下语句,方便url链接诶编写定位 <base href="${pageContext.request.scheme}://${pageContext.req ...

  6. Orcale 之基本术语一

    数据字典 数据字典是 Orcale 的重要组成部分.它有一系列的拥有数据库元数据信息的数据字典表和用户可以读取的数据字典视图组成,存放着数据库的有关信息.因此数据字典可以看作一组表和试图的集合.它们存 ...

  7. unity 读取外部exe程序控制台信息

    由于需要获取显卡信息,但是unity的自带函数,只能输出1个显卡 c#倒是可以但是引用了一个下载的dll   System.Management.dll 这个dll放到unity用不了,因为mono不 ...

  8. spring异常被吞的一种情形

    你是否遇到过下面的情况,控制台无限的输出下面的日志: Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImp ...

  9. bat下执行java程序报错处理

    G:\>java -Xms128M -Xmx512M -server -Dprogram.name=b omc-sa-tdtpagent -Dfile.encoding=GBK -Duser.t ...

  10. yii1的笔记

    $sql = 'SELECT * FROM to8to_worker_item limit 10'; $res = Yii::app()->db->createCommand($sql)- ...