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

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.dllHttpRequest的代码,可以发现有一个GetEntireRawContent方法,这个方法里,调用了HttpWorkerRequest对的GetPreloadedEntityBody方法来获取数据,可喜的是,这个方法是Public的,所以我们也可以直接调此方法来获取客户端发送的数据。
获取数据后,我们可以将这些数据写入到一个文件中,这些数据是byte[]类型的,在写入文件时,因为Http协议是基于文本的,所以我们可以采用System.Text.Encoding.GetString方法,将这些字节数组编码成字符串,我这里的编码采用ASCII,只是这样请求中的中文就成了乱码。这样就可以获取请求的内容的文体格式,以方便我们分析(在代码中,这个写文件的功能我已去除,因为这里写全部请求内容只是用于分析使用,请参见第一篇文章中我列出的请求内容示例)。
通过分析这些请求内容,我们可以发现:每个页面控件,均可以在这里找到对应的内容,两个控件内容间是用字符串“-----------------------------7d81e441d025c”分隔的。同时在我们反编译System.Web.dllHttpRequest的代码时,也可以发有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类。

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

转载于:https://www.cnblogs.com/nieweijing/archive/2012/02/25/2367887.html

【转】Asp.NET大文件上传组件开发总结(二)---提取文件内容相关推荐

  1. Asp.NET大文件上传组件开发总结(二)---提取文件内容

    不知地震什么时候结束,为了给老婆小孩守夜,看来还不能睡,那就把第二篇也写了吧,只是不知对大家有没有用哟. 为了提供文件内容,我们需要首先需确定客户请求中发送的有文件内容,然后确定文件内容的位置.这部分 ...

  2. ASP中文件上传组件ASPUpload介绍和使用方法

    [导读]要实现该功能,就要利用一些特制的文件上传组件.文件上传组件网页非常多,这里介绍国际上非常有名的ASPUpload组件 1 下载和安装ASPUpload   要实现该功能,就要利用一些特制的文件 ...

  3. 让asp.net默认的上传组件支持进度条反映(转)

    对于web下的上传,实际上更多的时候不用上传太大东西,asp.net默认的上传组件足够用了,美中不足就是没有上传进度反映,所以现在要做的就是在asp.net默认的上传基础上加上进度反映. 关于web上 ...

  4. Java 文件上传组件 Apache Commons FileUpload 应用指南(二)——FileUpload如何工作?

    在最初的 http 协议中,没有上传文件方面的功能.RFC1867("Form-based File Upload in HTML".) 为 http 协议添加了这个功能.客户端的 ...

  5. 多文件上传组件FineUploader使用心得

    原文 多文件上传组件FineUploader使用心得 做Web开发的童鞋都知道,需要经常从客户端上传文件到服务端,当然,你可以使用<input type="file"/> ...

  6. asp.net 大文上传配置

    asp.net 大文上传配置 配置iis的文件上传大小控制:今天先说一个问题,在window server2008 下配置上传文件的大小,除了工程自身的config外还需要配置一下服务器上的appli ...

  7. JS - 文件上传组件WebUploader使用详解1(带进度的文件上传

    一.基本介绍 1,什么是 WebUploader? WebUploader 是由百度公司团队开发的一个以 HTML5 为主,FLASH 为辅的现代文件上传组件. 官网地址:http://fex.bai ...

  8. 使用 Apache的文件上传组件(common-fileupload)来实现文件的上传

    文章目录 一.前言/先导 二.步骤 三.源码 四.测试结果 五.文件的下载 一.前言/先导 maven的依赖: 注意:common-fileupload,它需要依赖于 commons-io组件: &l ...

  9. 1.6 文件上传组件

    1.6 文件上传组件 1.6.1 基本形制 <input type="file" name="myfile"/> form的完整形制如下,它必须设定 ...

最新文章

  1. 解决 /usr/share/git-cola/bin/ssh-askpass: 3: exec: wish: not found
  2. centos5.8安装mysql5.3_CentOS 5.8 64位 源码安装mysql5.5.28
  3. Python03 拉格朗日插值法 牛顿插值法(附代码)
  4. coreboot学习0:二度相逢是初识
  5. php定位和天气,php – 根据用户所在地显示天气
  6. 有谁还记得“开源”已经20年了!
  7. webpack原理和优化
  8. 杰理AD14N/AD15N---外置Flash烧录音乐文件
  9. 开源网站的漏洞复现(appcms、wordpress)
  10. 【Codeforces Round #476 (Div. 2) [Thanks, Telegram!] B】Battleship
  11. bmp图片批量改成jpg
  12. 【Uplift】特征选择篇
  13. 最新的鄞比 服务器mp4,阳光之下播出,彭冠英好适合傅慎行,和李承鄞比肩的人出来了...
  14. 【Linux】磁盘类型设备驱动介绍
  15. Ubuntu安装.md阅读工具-Typora
  16. 实现不同的导航条,看直播app开发怎么做
  17. 理解vue-admin-template模板,连接后端改造登陆功能
  18. FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。附文件重命名代码
  19. 浙大Python 第1章-3 输出“人生苦短,我学Python” (10 分) ---- 过于ez
  20. 自然语言处理系列二十二》词性标注》词性标注原理》词性介绍

热门文章

  1. 64位浮点数_浮点数误差
  2. 人工智能与机器学习大牛们的blog
  3. 微软数据视界:图解数据分析价值
  4. terminal显示mysql_mac如何在terminal终端中操作mysql
  5. 人脸验证(三)--FaceNet
  6. php7数组写法,数组运算符 - PHP 7 中文文档
  7. java 应用监控系统_GitHub - jiangbin216/JavaMonitor: 一款适用于Java应用的在线性能监控系统(JM)...
  8. 【数据库原理实验(openGauss)】 使用JDBC连接数据库
  9. 如何判定某个类的职责是否够“单一”?
  10. javascript第二天学习