c# 大文件上传显示进度提高速度方法
c# 大文件上传显示进度提高速度方法
各位有啥好的方法嘛,不用第三方的
------解决方案--------------------传统的HTML上传方式难已满足超大文件的上传需求,因为使用传统HTML方式向服务器上传超大文件时,浏览器会建立一个连接,然后通过这个SOCKET连接向服务器POST数据。流程是没有问题,但是在国内由于许多地区的网络环境不稳定,同时速度也不快,这就导致浏览器建立的这个边接容易断开,或者是超时。比如你是广州联通网速是10KB/S,你向北京电信服务器上传数据,这速度肯定非常慢,因为跨网了,电信的网相互访问就快,而服务器不可能为你这一个用户等待这么长时间,因为这个连接资源是非常宝贵的。最好的方式是一个用户请求服务器只需要5秒,这样服务器的并发访问量才会比较大,同时能够处理的用户请求就越多。
第二个问题,如果用户上传1G的文件,现在已经上传了500MB,但是突然断网了,那么你让用户再重新上传前面的500MB吗?假设用户的网速是100KB/S,那么用户需要花1.4小时来重传前面的500MB。如果是这样的话,估记用户是无法接受的。
第三个问题,无论你是用原始HTML方式(即Form表单方式)上传还是使用Flash控件上传服务端都会分配一个与客户端相同大小的内存。比如用户上传的是1G,那么服务端就会分配1G内存,如果用户上传的是5G,那么服务端也会分配5G。那么假设10G个用户同时上传5G文件,那么服务端就需要至少50G内存。一般的服务端这时就会由于内存不足而崩溃掉。
------解决方案--------------------普通HTML或者C#都没有太好的方法。你可以看一下QQ邮箱,163邮件,115网盘,DBank网盘,360网盘,百度网盘,他们都是单独开发的一个控件来实现的。而不是使用普通的HTML方式来传。
因为普通HTML方式是没办法传几十MB的文件。除非你的服务器性能达到优酷服务器集群的性能。
------解决方案--------------------去查一下Httpworkrequest,应该中以满足你的要求。注意不是是httprequest,更不是httpwebrequest
------解决方案--------------------这在纯web环境下很难做到。
在winform环境下可以做得很好。因为winform对本地文件有完全的访问控制权,可以使用分段传输,多线程等方式提高可靠性和速度。
------解决方案--------------------在断点的问题上HTML5的FileAPI也许可以用得上。
------解决方案--------------------除了3楼,楼上的思路都有些问题。如果上传一个5G的文件,服务器会在内存上直接BLOCK 5G的内存空间,如果传到32位服务器(32位服务器理论最多有4G内存),而不经过处理,直接会把服务器弄爆,正确的处理方法,可以参照思归关于大文件处理方法,原理就是分块上传,而不是默认的直接把整个文件BLOCK到服务器内存中去。至于多人同时上传大文件是如何处理的,我理论的假设如下:
32位服务器4G内存,我们允许2G内存可以用于上传。
每个用户的文件分块后,每块上传大小假设为1024K(实际上每个用户上传速度都不同,那么每块上传时间也不等,但是某一时间段内每个人占用到服务器内存大小都是1024K),那么理论上同时允许2000人上传任意大小的文件。
至于上传进度如何来显示,在file的input被POST后,可以用:
HttpWorkerRequest request = (HttpWorkerRequest)((IServiceProvider)HttpContext.Current).GetService(typeof(HttpWorkerRequest));
//输出被上传文件的大小
Response.Write(request.GetKnownRequestHeader(11));
之后用已上传的大小/文件的大小,就可以得出进度了,这些都是理论,实际写的话,估计还会遇到点小问题。
最后要提高上传速度,我觉得这个取决于个人上载的带宽,一般用户上载贷款都很小,可以忽略这个问题。