ASP.NET用HttpListener实现文件断点续传
本文转载:http://www.cnblogs.com/TianFang/archive/2007/01/03/610739.html
断点续传的原理很简单,就是在Http的请求和应答的报文头上和一般的下载有所不同而已。 普通方式请求服务器上的一个文时,所发出的请求和接受到的服务器如下: request header:
Cache-Control: no-cache
Connection: close
Pragma: no-cache
Accept: */*
Host: localhost response header:
200
Content-Type: application/octet-stream
Content-Disposition: attachment;FileName=time.pdf 当服务器支持断点续传时,请求和应答如下: request header:
Cache-Control: no-cache
Connection: close
Pragma: no-cache
Accept: */*
Host: localhost
Range: bytes=15360- response header:
206
Content-Type: application/octet-stream
Content-Disposition: attachment;FileName=time.pdf 两个报文的不同部分已用红色部分标记出来。可以看出: 客户端报文头中通过Range报文头来标识客户期望的下载位置。
服务器的应答号为200时表示是从文件头开始下载,而206表示是从文件的特定位置开始传输,客户端从该应答号可以看出服务器是否支持断点续传。
也就是说,支持断点续传的时候可以从文件任一部分开始下载,而普通的方式只能从文件头开始下载。 要使得服务器支持断点续传,需要解决以下几个问题: 1。需要判断客户端是否是续传请求,如果是续传请求时,需要获取客户端所需的文件范围。 从上面的分析可以看到,当客户端为断点传输时,报文头里会增加Range字段,则可以通过如下方式判断是否是断点传输请求。 string range = request.Headers["Range"];
bool isResume = string.IsNullOrEmpty(range); 2。对客户端做正确的应答相应,以通知客户端服务器支持端点续传 当为断点传输请求时,对客户端的相应号可以通过如下方式设置: response.StatusCode = 206; 3。传送客户端所需正确的内容 传送客户端所需正确的内容一般需要经过以下几个步骤 通过分析range来获取客户端的文件请求范围。
断点传输请求时,所需的长度比文件的长度短,故需要正确的设置response.ContentLength64属性。
正确传输所需的内容
代码示例: static void ProcessHttpClient(object obj)
{
HttpListenerContext context = obj as HttpListenerContext;
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response; FileStream fs = File.OpenRead(@"f:\123.pdf"); //待下载的文件 long startPos = 0;
string range = request.Headers["Range"];
bool isResume = string.IsNullOrEmpty(range);
if (isResume) //断点续传请求
{
//格式bytes=9216-
startPos = long.Parse(range.Split('=')[1].Split('-')[0]);
response.StatusCode = 206;
response.ContentLength64 = fs.Length - startPos;
fs.Position = startPos; //设置传送的起始位置
}
else
{
response.ContentLength64 = fs.Length;
} Console.WriteLine("request header");
Console.WriteLine(request.Headers.ToString()); response.ContentType = "application/octet-stream"; string fileName = "time.pdf";
response.AddHeader("Content-Disposition", "attachment;FileName=" + fileName);
Stream output = response.OutputStream; try
{
Console.WriteLine("response header");
Console.WriteLine(response.Headers.ToString());
CopyStream(fs, output); //文件传输
output.Close();
}
catch (HttpListenerException e) //在未写完所有文件时,如果客户端关闭连接,会抛此异常
{
Console.WriteLine(e.Message);
//output.Close(); //如果执行此函数会抛异常在写入所有字节之前不能关闭流。
}
} static void CopyStream(Stream orgStream, Stream desStream)
{
byte[] buffer = new byte[1024]; int read = 0;
while ((read = orgStream.Read(buffer, 0, 1024)) > 0)
{
desStream.Write(buffer, 0, read); System.Threading.Thread.Sleep(1000); //模拟慢速设备
}
}
ASP.NET用HttpListener实现文件断点续传的更多相关文章
- B/S大文件断点续传
一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...
- [Asp.net 5] Options-配置文件(2)
很久之前写过一篇介绍Options的文章,2016年再打开发现很多变化.增加了新类,增加OptionMonitor相关的类.今天就对于这个现在所谓的新版本进行介绍. 老版本的传送门([Asp.net ...
- asp.net和js读取文件的MD5值的方法
前言 文件的md5值,即文件签名,为了验证文件的正确性,是否被恶意篡改等.每个文件有一个唯一的md5值. 最近公司开发的app文件包的校验就有用到文件md5值. 一.asp.net获取 ①和上传文件一 ...
- Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)
Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄
前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传. 在实际开发中,输入输出流用的比较少,但 ...
- asp.net word ecxel类型文件在线预览
asp.net word ecxel类型文件在线预览 首先得引用COM: Microsoft Excel 10 Object Library Microsoft Word 10 Object Libr ...
- ASP.NET- Web.Config配置大文件上传
在web.config中的<system.web></system.web>内加入如下代码: <httpRuntime executionTimeout="60 ...
- 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法
-----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...
- Asp.Net读取服务器EXE文件的方法!(超简单实例)
Asp.Net读取服务器EXE文件的方法!(超简单实例) Process process = new Process(); process.StartInfo.FileName = "d:\ ...
随机推荐
- ASP.NET Application,Session,Cookie和ViewState等对象用法和区别 (转)
在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等.下面分别介绍它们的用法和区别. 方法 信息量大小 作用域和保 ...
- 四大主流云平台对比--CloudStack, Eucalyptus, vCloud Director和OpenStack。
我迟早可能都要进入的领域,提前温习... 还有KVM,ESXI,API,XEN之间的术语和关系,也要心中有数.. ~~~~~~~~~~~~~~~~~~~ 云计算在如今的IT界一直是一个最热门的话题,鉴 ...
- Error -27791: Server xx has shut down the connection prematurely
最近在进行一次性能测试中遇到一个问题,并发较大的时候会出现LR出现Error -27791: Server xx has shut down the connection prematurely的ER ...
- easyui源码翻译1.32--accordion(手风琴)
前言 前几天加班比较忙 未能及时更新翻译的 今天多发布几篇..下载该插件翻译源码 Accordion 分类空间允许用户使用多面板,但在同一时间只会显示一个.每个面板都内建支持展开和折叠功能.点击一个面 ...
- *[topcoder]LittleElephantAndString
http://community.topcoder.com/stat?c=problem_statement&pm=12854&rd=15709 这道题DIV1 250的,还有点意思. ...
- asp.net上传图片(简单)
FileUpload: protected void UploadButton_Click(object sender, EventArgs e) { : Convert.ToInt64(Reques ...
- Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)
Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...
- CentOS5.5 下编译安装 LAMP
大纲 1.安装gcc编译器 2.卸载rpm安装的http和mysql软件 3.编译安装php依赖包 4.安装apache软件 5.安装mysql软件 6.安装php软件 7.安装memcache ph ...
- USACO4.13Fence Loops(无向图最小环)
最近脑子有点乱 老是不想清楚就啪啪的敲 敲完之后一看 咦..样例都过不去 仔细一想 这样不对啊 刚开始就写了一SPFA 最后发现边跟点的关系没处理好 删了..写dfs..还是没转化好 开始搜解题方法 ...
- c#反射重载方法(发现不明确的匹配)
GetMethod(string name) 在反射重载方法时,如果调用此重载方法,会产生 发现不明确的匹配 的错误. 解决方案如下: GetMethod("MethodName" ...