asp.net 从POST的数据流中提取参数和文件

所属分类: 网络编程 / ASP.NET 阅读数: 1453
收藏 0 赞 0 分享
模拟的POST请求也一样。但有时可能模拟POST数据格式不是很标准(可能吧,没太细研究),在服务端是获取不到数据的。最近就遇到了这么一个麻烦的事,数据是一个合作方通过模拟POST的。

无奈之下,想到了一个下下策,那就是通过分析接受到的输入流,从中提取想要的数据。比如我在上文中提到的数据(两个参数,一个图片文件)

实现思路:读取输入流,通过非文件部份的分析,确定文件在整个流中的位置和大小,再对输入流重新读取以得到文件。

看上面的POST数据,参数部分及分隔符等,说白了都是些字符串。基本上都是英文数字符号等,如有中文发送之前可做一下编码,这样基本上可以确保不会因编码问题造成计算失误(英文字符各编码都是相同的)。这一部分内容(非文件部分,文件部分是二进制格式来的,千万别这样去做)可以得到。
通过接受输入的流转成字符串,如果参数中有中文,请注意客户端POST时使用何种编码:

复制代码 代码如下:

byte[] input = Request.BinaryRead(Request.TotalBytes);
string source = Encoding.UTF8.GetString(input);

然后通过正则表达式,匹配上面的非文件部份内容,此处略,再把得到的内容转成byte[],计算出它的长度。参数的值可以在这里得到了。
复制代码 代码如下:

Regex rginput = new Regex("略");
if (rginput.IsMatch(source))
{
int headLength=Encoding.UTF8.GetBytes(rginput.Match(source).Value)
}

同理计算出结尾出"-----------------------------7da119c1004a6--"的长度(这个每次请求应该是固定的)。注意有换行回车符。

这样,文件之外的部份在整个流中的大小可以确定,也就是说文件在整个流中的位置和大小也确定了。那么通过对原始流的重新读取就可以得到文件部份。如果文件是文本类型的,可以不用这样,直接跟参数部份一样分析获取。
复制代码 代码如下:

//保存文件
FileStream fss = new FileStream("path", FileMode.Create);
fss.Write(input, headLength, input.Length-headLength-footLength);
fss.Close();


代码
复制代码 代码如下:

//得到文件字节数组
byte[] imgcont = new byte[input.Length - headLength-footLength];
MemoryStream ms = new MemoryStream(input);
//光标移动到文件开始处
ms.Seek(headLength,SeekOrigin.Begin);
ms.Read(imgcont, 0, imgcont.Length);
ms.Close();

注:这个方法有一定的风险,就是对文件的大小和位置的确定,一定要计算准确,对输入流的分析要想周到全面;还有当上传文件为多个时,这个方法就麻烦了...如果你有更好的方法,可留言交流。

更多精彩内容其他人还在看

ASP.Net 之Datalist删除功能详解附代码

ASP.Net 之Datalist删除功能详解附代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

ASP.NET(C#)验证数字的两种方法

ASP.NET(C#)验证数字的两种方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

此页的状态信息无效,可能已损坏 的处理办法及原因分析

此页的状态信息无效,可能已损坏 的处理办法及原因分析,需要的朋友可以参考一下
收藏 0 赞 0 分享

MultiLine 换行后实现读取不换行的具体思路

输入内容中有换行,保存到数据库,直接查看感觉没有换行,但查询结果“以文本格式显示结果”你就会发现 其实是有换行的,下面与大家分享下具体的解决方法
收藏 0 赞 0 分享

swfupload ajax无刷新上传图片实例代码

在这里上传图片就需要用到ajax无刷新上传图片,这里面包含的东西不是一点半点。这里用到的是一个插件swfupload实现无刷新上传图片,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

静态gb2312编码在项目传值出现中文乱码现象

参考的美工静态页面是gb2312格式的,当此编码拿到项目中后,utf-8编码的系统,加载页面时,会出现样式问题,比如不能正常居中等
收藏 0 赞 0 分享

System.Timers.Timer定时执行程序示例代码

如果是某个逻辑功能的定时,可以将code放到逻辑功能的类的静态构造函数中,在该逻辑类第一次执行时,静态构造函数会被调用,则定时自然启动
收藏 0 赞 0 分享

分享下Asp.Net面试题目及答案集合

这篇文章主要是总结asp.net开发人员在面试过程中常遇到的一些问题小结,需要的朋友可以参考下
收藏 0 赞 0 分享

给自定义Web控件添加事件(前后台代码)

给自定义控件(Web Control)添加事件具体前后台代码如下,感兴趣的朋友可以参考下哈
收藏 0 赞 0 分享

ASP.NET过滤器的应用方法介绍

ASP.NET过滤器的应用方法介绍,需要的朋友可以参考一下
收藏 0 赞 0 分享
查看更多