All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
正则表达式应用--利用正则替换字符_[SQL,Server教程]
SQL,INNER,JOIN,关键字_mssql学习_编程技术
javascript事件列表_JavaScript技术_编程技术
基于Gettext的asp.net网站多语言解决方案_.net资料_编程技术
多国语言的实现方法在ASP.NET中_[Asp.Net教程]
PHP实例:用PHP实现windows风格的树型菜单_php资料_编程技术
剖析SQL Server 2005查询通知之基础篇_[SQL Server教程]
SQL,server,2005中的DATENAME函数_[SQL,Server教程]
C#教程:删除线程
asp.net判断页面加载所用时间_[Asp.Net教程]
Reading number is top 10 pictures
The money of more than 100 countries and regions20
The Soviet union swimsuit exposure in the 70 year2
汪峰的梦想
漂亮脸蛋魔鬼身材2
BingBingFan apple dew point photo gallery4
30 beautiful school beauty2
Absolutely shocked. National geographic 50 animal photographys3
Look for from human art net, is good--3
29 the belle stars after bath figure2
Female model behind the bitterness, often being overcharged3
Download software ranking
Macromedia Dreamweaver 8
都市狐狸姑娘传
Boxer's Top ten classic battle8
Eclipse 4.2.2 For Win32
Sora aoi 120 minutes
Ashlynn Video1
The Bermuda triangle2
XML+Web+Service开发教程
c#程序设计案例教程
C#与.NET技术平台实战演练
归海一刀 published in(发表于) 2014/1/30 1:20:38 Edit(编辑)
Asp.NET大文件上传组件开发总结(二)---提取文件内容_[Asp.Net教程]

Asp.NET大文件上传组件开发总结(二)---提取文件内容_[Asp.Net教程]

Asp.NET大文件上传组件开发总结(二)---提取文件内容_[Asp.Net教程]

不知地震什么时候结束,为了给老婆小孩守夜,看来还不能睡,那就把第二篇也写了吧,只是不知对大家有没有用哟。


为了提供文件内容,我们需要首先需确定客户请求中发送的有文件内容,然后确定文件内容的位置。这部分对应的代码如下:


1HttpApplication app = sender as HttpApplication;
2 HttpWorkerRequest request = GetWorkerRequest(app.Context);
3
4 if (!IsUploadRequest(app.Request)) return; //不是文件上传,则退出
5
6 string sContentType = app.Request.ContentType.ToLower();
7 byte[] arrBoundary = GetMultipartBoundary(sContentType);
8 int ContentLength = app.Request.ContentLength; //信息体的总长度
9
10 DataReader dataReader = new DataReader(app.Context.Request.ContentEncoding, arrBoundary);
11 DateTime startDate = DateTime.Now;
12 byte[] arrBuffer = request.GetPreloadedEntityBody();
13 if (arrBuffer == null)
14 {
15 arrBuffer = new Byte[0];
16 tempFile.Close();
17 return; //没有读取到信息体
18 }
19 else
20 {
21 这里是对文件内容的处理
22 }
上面的代码中,我们先获取Asp.NET对客户端请求的处理对象HttpWorkerRequest,然后根据这个对象的ContentType属性是否为multipart/form-data来确定对应的请求是否有上传文件,如果没有上传文件,就不处理此请求,以提高处理效率。这样处理的依据是,在有文件上传的HTML Form中,对应的enctype属性为multipart/form-data。这样就解决了确定客户端请求中是否发送有文件内容。
要确定文件的内容位置,为此我们需要使用Reflector工具反编译System.Web.dll中HttpRequest的代码,可以发现有一个GetEntireRawContent方法,这个方法里,调用了HttpWorkerRequest对的GetPreloadedEntityBody方法来获取数据,可喜的是,这个方法是Public的,所以我们也可以直接调此方法来获取客户端发送的数据。
获取数据后,我们可以将这些数据写入到一个文件中,这些数据是byte[]类型的,在写入文件时,因为Http协议是基于文本的,所以我们可以采用System.Text.Encoding.GetString方法,将这些字节数组编码成字符串,我这里的编码采用ASCII,只是这样请求中的中文就成了乱码。这样就可以获取请求的内容的文体格式,以方便我们分析(在代码中,这个写文件的功能我已去除,因为这里写全部请求内容只是用于分析使用,请参见第一篇文章中我列出的请求内容示例)。
通过分析这些请求内容,我们可以发现:每个页面控件,均可以在这里找到对应的内容,两个控件内容间是用字符串“-----------------------------7d81e441d025c”分隔的。同时在我们反编译System.Web.dll中HttpRequest的代码时,也可以发有GetMultipartBoundary这个方法,这个方法我们可以从字面意思得知是取分隔标识。我们把这个方法提取出来:
1private byte[] GetMultipartBoundary()
2{
3 string attributeFromHeader = GetAttributeFromHeader(this.ContentType, "boundary");
4 if (attributeFromHeader == null)
5 {
6 return null;
7 }
8 attributeFromHeader = "--" + attributeFromHeader;
9 return Encoding.ASCII.GetBytes(attributeFromHeader.ToCharArray());
10}


然后我们采用这个方法,就可以从请求的内容中提取出类似“-----------------------------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



我们可以发现,文件上传控件有一个filename属性,然后,下一行指定文件的MIME类型,随后这个空白行,在空白行下面,直到下一处类似“-----------------------------7d81e441d025c”标志字符串间,就是客户端发送的文件内容。我们只需把这些内容写入到服务器文件中即可。


这里,文件内容的提取的问题就可以解决了。在提取文件内容时,对处理标志字符串时需要特别处理,防止标志字符分别读取到两个缓冲区中,所以这部分代码还是比较多的,具体请参看源代码中的DataReader类。


第二篇就写到这,实在是太困了,后面的等一下再写吧!







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.