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:\ ...
随机推荐
- HTML5给我们带来了什么?
HTML5初探 传说中的HTML标准已经超过10年没有更新了,如今HTML5席卷全球,那么到底什么是HTML5呢?都在讲HTML5是web的新一代标准,它有着很多之前浏览器没有的新特性,可以说HTML ...
- Bootstrap 貌似不错,先做一下记录
Bootstrap 简洁.直观.强悍的前端开发框架,让web开发更迅速.简单. http://www.bootcss.com/
- UL LI 布局 TAB 切换条
web页面实现tab的功能有几种实现方式,下面是使用UL LI DIV方式实现的tab. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- 知识总结: Activity的四种启动模式
通常情况下,一个应用有一个Task,这个Task就是为了完成某个工作的一系列Activity的集合.而这些Activity又被组织成了堆栈的形式.当一个Activity启动时,就会把它压入该Task的 ...
- 【HDOJ】1033 Edge
题目英文太多,简单翻译了一下:1. For products that are wrapped in small packings it is necessary that the sheet of ...
- MFC框架
第一点:类别型录网的搭建: 类别型录网搭建的目的是为了实现所谓的"执行期类型识别",也就是在程序运行的时候识别出某个对象是否是某个类的实例(基类也可以).这里还不是很明白为什么需要 ...
- find和findstr
find与findstr 例“ 在文件中搜索字符串. 1.findstr . 2.txt 或 Findstr "." 2.txt 从文件2.txt中查找任意字符,不包括空字符或空行 ...
- Android学习之路——简易版微信为例(二)
1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样, ...
- C# asp.net 操作Word的前提配置和简单的方法
操作的前提: 1.要保证机器本身要安装OFFICE. 有时安装了Office,但是不能找到Microsoft Word 11.0(或者更高的版本) Object Library.那可能是因为在安装of ...
- android手机屏幕分辨率 及 sp dip(dp) px 区别 及高中低分辨率时处理
分辨率,是指单位长度内包含的像素点的数量,它的单位通常为像素/英寸(ppi).以分辨率为1024×768的屏幕来说,即每一条水平线上包含有1024个像素点,共有768条线,即扫描列数为1024列,行数 ...