C# http大文件断点续传

本文介绍了一种解决大文件上传难题的方法,通过服务端记录文件上传指针位置,并结合客户端切片上传的方式实现断点续传。该方案有效避免了因文件过大导致的服务器内存溢出问题。
net里的文件上传一直都很纠结,尤其是大文件就更不用说了,这跟.net的处理机制不无关系,当我们发送一个上传请求,.net要将所有的Request Body加载到内存中再进行处理,可想而知,如果允许客户端上传几个1G的文件试下,服务器早都瘫痪了。鉴于此,最直接的办法就是限制请求的长度,.net站点默认的请求长度限制为2MB,我们可以通过修改站点下的web.config,将该值最大设置到30MB,这是IIS默认最大的支持(鉴于不同的版本,该值可能会有差异),想再大点,那就得从IIS入手了,修改配置什么的,而且IIS里最大支持的也仅仅为4GB。

那么,我们如果能将文件打散,进行切片处理,一段一段的上传不就解决了这个问题么,看似简单,其中最难的是记录文件流的指针位置,在切片处理了之后,指针位置的记录要绝对精确,发生一个位移那文件上传了也是个废的。

在该思想的引导下,再进行思考,如果我们能将文件流指针记录到服务端,每次客户端在进行上传的时候,先查询指针位置,再进行切片上传,问题不就解决了么。

好了,思想有了,下面就是设计、编码了。

 

下面是楼主在该思想的指引下,开发的一个简易的大文件断点续传系统,时间仓促,尚未进行优化处理。

Http大文件断点续传

author:Kilin;   email:zhang_7150@163.com
BreakpointTransmission.Service断点续传服务端服务
BreakpointTransmission.Client断点续传客户端服务
BreakpointTransmission.WebTester断点续传服务端Host
BreakpointTransmission.Client.Tester断点续客户端Host

说明:

1、大文件上传需将Service Host到IIS

2、修改IIS默认的请求限制。修改方法见下:

  • 在配置文件%windir%\System32\inetsrv\config\applicationHost.config中的节点requestFiltering下增加配置节:
    <requestLimits maxAllowedContentLength="1072741824" />
    节点说明:maxAllowedContentLength属性配置Request Body的最大长度,单位:byte,最大值为4GB,默认为30MB
  • 重新启动IIS,命令行输入(需要管理员权限):iisreset /RESTART

3、设计思想:在服务端记录当前上传的指针位置,在客户端对大文件进行切片,分批上传。

4、程序中预留了接口IHttpUploadFilePathRouting,作为上传路径的算法接口,可方便支持各种多种需求的路径算法。

5、程序中预留了接口IBreakpointAcceptFileHandler,作为上传注入的插件,可方便的支持多种方式的上传需求(如DFIS)。

 

源代码下载地址:http大文件断点续传源代码

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值