后台自己写了一个简单的generic handler,用来下载文件。
可以看到只是简单地回传字节流,并没有实现断点续传。
我在chrome中测试,在下载过程中 暂停|继续,依旧正常下载。
问题:
1. 断点续传的应用场景 ?
2. 在我的测试中,暂停|继续 是否属于断点续传 ?
3. 断点续传中 每次暂停后继续,是否都应该发起一次新的请求,这些请求如何捕获 ?
4. 如何本例属于断点续传,难道客户端和服务端不用打配合 ?光光客户端就能搞定 ?
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Service.Excel; using System.Net; namespace Demo.Excel.Web { /// <summary> /// Summary description for ExcelHandler /// </summary> public class ExcelHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { byte[] fileBytes = new byte[0]; System.IO.FileStream fs = System.IO.File.Open(@"\\scanning-pc\PortArthur\WindowsXPMode_en-us.zip", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite); fileBytes = new byte[(int)fs.Length]; fs.Read(fileBytes, 0, fileBytes.Length); string aFileName = "test.zip"; context.Response.AddHeader("content-disposition", "attachment;filename=" + aFileName); context.Response.ContentType = "application/octet-stream"; context.Response.BinaryWrite(fileBytes); fs.Close(); context.Response.End(); } public bool IsReusable { get { return false; } } } }
大文件下载需要断点续传吧,早期为了充分利用带宽,当第一次请求获得文件长度后会起若干线程分别指明下载的range进行下载,最后把各线程下载的合并为完整文件。
就你的代码而言不是断点续传,客户端应该会在请求中包含一个range,指明我要哪部分,服务端会给一个acceptrange(记不太清楚了,最好你去查下)告知客户端我响应你的数据是哪个部分(和客户端请求范围对应)
每次断点续传都是一次新的请求,比如你的就是一次新的http请求。这些请求应该可以通过chrome的f12看到吧。
另,虽然你的代码不是断点续传的写法,但chrome如何做到断点续传的不太清楚,可能只是没有给服务端响应,服务端也只能傻傻的等着(不确定,可能是错的)
另2:你的代码这样写有问题,一次加载400多M的文件到内存这个对服务器影响太大了,你应该是按流的方式读一些flush一些。
多谢提点
1、断点续传功能,既可节约时间又可以节约金钱。
2、定时下载功能,可以为将要下载的软件制定一任务列表,让下载软件在规定的时间自动拨号上网并下载软件,下载完毕后再自动挂起Modem,断开与internet的连接,甚至自动关闭计算机。
3、多文件同时下载。
4、支持拖放式操作,可将下载文件的URL超链接用鼠标拖放到下载软件的窗口上,即可激活下载软件,同时开始文件的下载。
5、自动捕捉剪贴板上的URL并激活下载软件,可以捕捉到剪贴板中的URL,甚至浏览器中单击下载文件超链接,即可激活程序实现文件的下载。
6、致命错误发生时的关闭机制。
7、预防病毒侵害的安全机制,文件下载完毕,即可自动将其发送到指定的病毒的检测软件进行病毒扫描。
断点续传下载软件包括Thunder、NetAnts、FlashGet、Net Vampire、Download Manager、GetRight、Go!Zilla、WinDownload等。