网站程序上传到服务器方法汇总(3)
作者:行云止水 来源:网页教学网 发布时间:2008-01-26 19:52:00
二、利用RFC1867标准处理文件上传的两种方式:
1.一次性得到上传的数据,然后分析处理。
看了N多代码之后发现,目前无组件程序和一些COM组件都是使用Request.BinaryRead方法。一次性得到上传的数据,然后分析处理。
这就是为什么上传大文件很慢的原因了,IIS超时不说,就算几百M文件上去了,分析处理也得一阵子。
2.一边接收文件,一边写硬盘。
了解了一下国外的商业组件,比较流行的有Power-Web,AspUpload,ActiveFile, ABCUpload,aspSmartUpload,SA-FileUp。其中比较优秀的是ASPUPLOAD和SA-FILE,他们号称可以处理2G的文件(SA-FILE EE版甚至没有文件大小的限制),而且效率也是非常棒,难道编程语言的效率差这么多?查了一些资料,觉得他们都是直接操作文件流。
这样就不受文件大小的制约。但老外的东西也不是绝对完美,ASPUPLOAD处理大文件后,内存占用情况惊人。1G左右都是稀松平常。至于SA-FILE虽然是好东西但是破解难寻。然后发现2款.NET上传组件,Lion.Web.UpLoadModule 和 AspnetUpload也是操作文件流。但是上传速度和CPU占用率都不如老外的商业组件。
做了个测试,LAN内传1G的文件。ASPUPLOAD上传速度平均是4.4M/s,CPU占用10-15,内存占用700M。SA-FILE也差不多这样。而AspnetUpload最快也只有1.5M/s,平均是700K/s,CPU占用15-39,测试环境: PIII800,256M内存,100M LAN。我想AspnetUpload速度慢是可能因为一边接收文件,一边写硬盘。资源占用低的代价就是降低传输速度。但也不得不佩服老外的程序,CPU占用如此之低.....。
三、ASP.NET上传文件遇到的问题
我们在用ASP.NET上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题,因为ASP.NET会block直到把整个文件载入内存后,再加以处理。实际上,如果文件很大的话,我们经常会见到Internet Explorer显示 "The page cannot be displayed - Cannot find server or DNS Error",好像是怎么也catch不了这个错误。为什么?因为这是个client side错误,server side端的Application_Error是处理不到的。
四、ASP.NET大文件上传解决方案
解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度。
Lion.Web.UpLoadModule和AspnetUpload 两个.NET组件都是利用的这个方案。
方案原理:
利用HttpHandler实现了类似于ISAPI Extention的功能,处理请求(Request)的信息和发送响应(Response)。
方案要点:
1. httpHandler or HttpModule
a.在asp.net进程处理request请求之前截获request对象
b.分块读取和写入数据
c.实时跟踪上传进度更新meta信息
2. 利用隐含的HttpWorkerRequest用它的GetPreloadedEntityBody 和 ReadEntityBody方法处理文件流
IServiceProvider provider = (IServiceProvider) HttpContext.Current;
HttpWorkerRequest wr = (HttpWorkerRequest) provider.GetService(typeof(HttpWorkerRequest));
byte[] bs = wr.GetPreloadedEntityBody();
....
if (!wr.IsEntireEntityBodyIsPreloaded())
{
int n = 1024;
byte[] bs2 = new byte[n];
while (wr.ReadEntityBody(bs2,n) >0)
{
.....
}
}
3. 自定义Multipart MIME 解析器。
自动截获MIME分割符。将文件分块写如临时文件。实时更新Appliaction 状态(ReceivingData, Error, Complete) 。


猜你喜欢
- 10月15日,第一视频(0082.HK)董事局主席张力军表示,第一视频斥资1.68亿人民币收购中国品牌手机游戏开发服务商Dragon Joy
- 移动设备出现这样问题的原因是由于它们完全脱离管理控制(除非你买了第三方软件)。Windows没有任何针对移动设备的群机制设置,所以用户可以很
- 自从上次由于没有成功备份导致博客的大部分文章无法还原之后,我就更加小心博客的备份了,并且还尝试了多种的备份方法,以下是其中三种直接备份&nb
- 首先确认本机ip可以看出一下信息:本机ip: 192.168.1.162网关:192.168.1.1DNS服务器:192.168.1.1虚拟
- 最近在自己的电脑上搞了个ubuntu server,自己做点小demo,当需要连接网络时问题来了,没法连接网络,网上有一些资料都是一笔带过,
- 公司的产品一直运行在云服务器上,从而有幸接触过aws的ec2,盛大的云服务器,最近准备有使用阿里云的弹性计算(云服务器)。前两种云服务器在安
- 最近在研究本站:www.seocompany.sh.cn 网站优化的时候,发现本站内容不足,于是决定采取增加BLOG的策略。但,天下之大,B
- 从10月7号开始到10月15日止,已经有8天了,网络上关于uucall断网事件的真相之争从来就没有停息过。根据专业人士的判断以及网友们的各种
- 马云收购口碑网,互联网江湖重现当年淘宝的烧钱令:碑2008年必须花掉多少亿,同时淘宝网在二手房等频道也给予口碑网巨大的流量支持。胆识胆识:胆
- 本文介绍了详解如何在VMware workstation 14 pro(虚拟机)上安装系统,分享给大家,具体如下:点击创建新的虚拟机选择稍后
- 个性化的应用是SNS网站的鲜明特征之一,各种各样的应用使得SNS网站充满着生机。SNS平台与第三方开发者为SNS网站提供的应用数量动辄数百上
- 如下操作步骤为linux系统中部署jdk环境1.下载jdk安装包 jdk官网下载地址https://www.oracle.com/
- 友情链接,刚开始是以友情和推荐的身份展示给大家的。随着商业气息的逐渐变浓以及互联网的发展,慢慢地也就演变成一种有价资源。因为交换友情链接这项
- 网赚和经营小生意并没有什么不同,只要你用心经营和努力就获利的机会,但如果你不摆任何心思在网赚上,你要获利的机会就微乎其微。另外广开财源绝对是
- 为什么要看日志?比如启动容器失败,却不给出任何提示,这时候我们就需要查看下到底是为什么? 查看日志: 命令格
- 注:这是从PHPCMS开发文档里看到编码规范,虽名为PHPCMS的开发规范,但我觉得所有的PHP编程都该如此。写了那么多PHP,很多编码对照
- 如果说病毒制造者是造成目前网络上病毒肆虐的罪魁祸首,那么为病毒四处传播“提供”渠道的各种网络通信形式
- UCenter Home是Comsenz公司发布的一款SNS建站系统,目前最新版本是1.5。用户栏目功能是UCenter Home中用于丰富
- 本文介绍了如何使用Windows NT系列的服务器操作系统中的安全配置功能,网友可以对操作系统的帐户管理,服务管理和审核方法有一定的了解。帐
- 前言Linux系统下创建快捷方式可以更快地打开应用。这里给大家介绍了一种方法,也是之前查了些资料整理的,跟大家分享一下。顺便说一下,在Lin