Asp.NET大文件上传组件开发总结(二)---提取文件内容
来源:互联网 发布:良辰好景知几何txt书包 编辑:程序博客网 时间:2024/06/05 10:35
来源:http://it.hywxfashion.cn/p/c/2008/05/15/ea209421-6c66-4cd4-b7af-8a097714a218.shtml
为了提供文件内容,我们需要首先需确定客户请求中发送的有文件内容,然后确定文件内容的位置。这部分对应的代码如下:
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:/documentsandsettings
/administrator/??????/componentart.web.ui.rar"
content-type:application/x-rar-compressed
rar!??s
我们可以发现,文件上传控件有一个filename属性,然后,下一行指定文件的mime类型,随后这个空白行,在空白行下面,直到下一处类似“----- ------------------------7d81e441d025c”标志字符串间,就是客户端发送的文件内容。我们只需把这些内容写入到服务器文件中即可。
这里,文件内容的提取的问题就可以解决了。在提取文件内容时,对处理标志字符串时需要特别处理,防止标志字符分别读取到两个缓冲区中,所以这部分代码还是比较多的,具体请参看源代码中的datareader类。
第二篇就写到这,实在是太困了,后面的等一下再写吧!
- Asp.NET大文件上传组件开发总结(二)---提取文件内容
- 【转载】Asp.NET大文件上传组件开发总结(二)---提取文件内容
- 【转载】Asp.NET大文件上传组件开发总结(三)---处理文件内容
- Asp.NET大文件上传开发总结(二)
- Asp.NET大文件上传开发总结
- Asp.NET大文件上传开发总结
- 【转载】Asp.NET大文件上传组件开发总结(五)---上传进度信息的显示
- asp.net 开发中大文件上传组件的解决方案
- 【转载】Asp.NET大文件上传组件开发总结_NET2.0源码下载。
- ASP.Net大文件上传组件详解
- 【转载】Asp.NET大文件上传组件开发总结(四)---封送数据给Asp.NET页面
- Asp.NET大文件上传开发总结(一)
- Asp.NET大文件上传开发总结(一)
- Asp.NET大文件上传开发总结(一)
- 【转载】Asp.NET大文件上传开发总结(一)
- Asp.NET大文件上传开发总结(一)
- asp.net neatUpload 支持大文件上传组件
- ASP.NET批量上传文件组件(二)
- 成长轨迹:更近Linux,这些天的微妙感觉
- Hamo’s World ?? 让MFC程序具有XP的风格(style)
- 文件加密标识 -隐藏文件头的黑客代码
- csdn
- 浅谈Asp.net多层架构中的变量引用与传递
- Asp.NET大文件上传组件开发总结(二)---提取文件内容
- libpcap简介及网络监测系统
- asp.net控件开发(一)-显示控件内容
- 通过jaxws-ri于webservice与一次亲密接触
- 设置NULL DACL权限描述符解决ASP.NET通过FileMapping与其他进程..
- asp.net控件开发(二)-简单属性
- vc++ 使用command 对象通过parameter 实现插入二进制数据
- vista无法打开摄像头的解决方法!
- ECC原理