当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > Asp.NET大文件上传开发总结集合

ASP.NET
赫赫大名的A*寻路算法(vb.net版本)
asp.net(c#)下Jmai去说明 使用与下载
[原创]完美解决Could not load file or assembly ''AjaxPro.2'' or one of its dependencies. 拒绝访问。
asp.net下gridview 批量删除的实现方法
用CSS实现图片倾斜 只支持IE
.net get set用法小结
vs 不显示行号的操作方法
ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
ASP.Net不执行问题一解
asp.net 无限分类
让VS2008对JQuery语法的智能感知更完美一点
扩展方法ToJSON() and ParseJSON()
asp.net下PageMethods使用技巧
Linq to SQL Delete时遇到问题的解决方法
实现ASP.NET多文件上传程序代码
ASP.NET AJAX 1.0 RC开发10分钟图解
asp.net get set用法
ASP.NET下使用WScript.Shell执行命令
asp.net2.0实现邮件发送(测试成功)
Asp.net 无限级分类实例代码

ASP.NET 中的 Asp.NET大文件上传开发总结集合


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 113 ::
收藏到网摘: n/a

 以前开发过一个用Asp.NET上传大文件的代码,由于是在NET1.1下开发的,发现不能在NET.20下运行,前几天将这个问题解决了,现在把整个开发过程整理一下,供大家参考。由于内容较多,所以我打算分成六篇来写,第一篇写一下需要解决的问题和大致解决思路,再用四篇具体写一下开发中需要解决的四个主要问题,最后再写一个组件的使用方法。

1、问题提出:

使用Asp.NET在上传文件时,IIS接收到请求内容后,发送到Asp.NET的管道中,然后Asp.NET的ISAPI将读取的内容是全部装入服务器内存(NET2.0在请求内容较大时,会存放到临时文件中,见后面的开发说明),在上传文件时,消耗服务器资源较多,所以Asp.NET对上传文件的大小会有限制,且不能提供上传进度显示。而我们在实际应用中,往往会上传较大的文件的现象,这时,可以通过修改配置文件将最大将求长度配置设置得很大,但这样,服务器将会消耗大量内存。

为此,如果可以在IIS将客户端发送的内容发送到Asp.NET的管道时,随着服务器接收内容的同时,将文件内容写到服务器磁盘中,然后在Asp.NET的管道中只放入请求的对应的Form内容。这样可以避开Asp.NET上传文件的大小限制,同时提供服务器接收进度显示。

2、解决方案分析:

Asp.NET提供了HttpModule功能,提供了让用户处理客户请求的手段,要实现HttpModule功能,用户只需实现System.Web.IHttpModule接口。System.Web.IHttpModule定义了两个方法void Init (HttpApplication context)和void Dispose (),Init方法给我们提供了一个类型为HttpApplication的参数,这个HttpApplication类型中,给我们提供了处理Asp.NET页面生命周期中发生的各种事件(具体请参照MSDN),我们只需要在最早的事件BeginRequest中,处理数据接收,就可以避开Asp.NET的最大请求长度限制。

为了不改变Asp.NET对页面处理逻辑,我们需要在提供文件内容后,将其它请求内容正确封装给Asp.NET,为此我们需要分析客户端发送到服务器端内容的具体格式,我们可以通过其它工具,提供这些内容,这些内容大致如下:

以下为引用的内容:

-----------------------------7d81e441d025c

Content-Disposition: form-data; name="UploadID"

de858d87-e8b8-4f7a-a832-357da2efdf13

-----------------------------7d81e441d025c

Content-Disposition: form-data; name="__VIEWSTATE"

/wEPDwULLTIwODE1OTkzNTUPZBYCAgMPFgIeB2VuY3R5cGUFE211bHRpcGFydC9mb3JtLWRhdGFkZAQ0pcd9kiSZ7

/MOe0enKOTGFxMk

-----------------------------7d81e441d025c

Content-Disposition: form-data; name="TextBox1"

-----------------------------7d81e441d025c

Content-Disposition: form-data; name="TextBox2"

-----------------------------7d81e441d025c

Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\

Administrator\??????\componentart.web.ui.rar"

Content-Type: application/x-rar-compressed

Rar! ??s这里我把文件具体内容去掉了,我们提取文件后,封送给Asp.NET也就是去掉这部分后的内容。

-----------------------------7d81e441d025c

Content-Disposition: form-data; name="Button1"

开始上传

-----------------------------7d81e441d025c

Content-Disposition: form-data; name="__EVENTVALIDATION"

/wEWBAL1w7VGAuzRsusGAuzR9tkMAoznisYGMJIxZyapejeOQaIIwcOkPrWK6nE=

-----------------------------7d81e441d025c--

请注意红色注释部分,那里原来是上传的文件内容,我们封送给Asp.NET就应当时去掉文件内容后内容,这样,页面控件的值、页面事件就会正确的发送到Asp.NET页面。只是页面不能正确获取上传文件的内容。

这里又出现了三个问题:一是:我们如何获取文件内容,如何确定那部分内容是上传的文件内容而不是页面其它控件内容;二是:我们如何在提取文件内容后让Asp.NET页面正确获取文件;三是:我们如何将改写后的内容封送给Asp.NET,让它感觉不到我们提取了文件内容。

只要解决了上面三个问题,那大文件上传的问题就解决了,最后就是提供进度显示,由于内容较多,我分四部分来介绍这三个问题和进度显示。