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大文件断点续传源代码
本文介绍了一种解决大文件上传难题的方法,通过服务端记录文件上传指针位置,并结合客户端切片上传的方式实现断点续传。该方案有效避免了因文件过大导致的服务器内存溢出问题。
708

被折叠的 条评论
为什么被折叠?



