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

 更新时间:2010年02月26日 16:00:03   作者:  
按理,Form提交的数据,无论是application/x-www-form-urlencoded还是multipart/form-data(有附件时),都可在服务端通过Request.Form["name"]和Request.Files["name"]获取到参数和上传的文件。
模拟的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();

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

相关文章

  • TreeView无刷新获取text及value实现代码

    TreeView无刷新获取text及value实现代码

    这篇文章介绍了TreeView无刷新获取text及value实现代码,有需要的朋友可以参考一下
    2013-10-10
  • asp.net 自制的单选、多选列表实现代码

    asp.net 自制的单选、多选列表实现代码

    在ASP.NET的页面上,ListBox最终是渲染成select元素,而CheckListBox最终被渲染成div或者是table,使得二者的样式无法统一,或者说要统一很麻烦。
    2009-08-08
  • .NET5实现操作注册表的方法

    .NET5实现操作注册表的方法

    本文详细讲解了.NET5实现操作注册表的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • ASP.NET Core使用EF查询数据

    ASP.NET Core使用EF查询数据

    这篇文章介绍了ASP.NET Core使用EF查询数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • .net实现webservice简单实例分享

    .net实现webservice简单实例分享

    这篇文章主要介绍了.net实现webservice简单实例,需要的朋友可以参考下
    2014-04-04
  • ASP.NET 2.0中的页面输出缓存

    ASP.NET 2.0中的页面输出缓存

    ASP.NET 2.0中的页面输出缓存...
    2006-09-09
  • .NET 单点登录解决方案

    .NET 单点登录解决方案

    这里指的单点,泛指在WEB服务端,一个账户同一时刻只能存在一个票据!怎么使同一个用户,在同一时间内只允许登录一次,下面将为大家详细介绍下
    2013-10-10
  • asp.net 网络硬盘实现分析

    asp.net 网络硬盘实现分析

    随着网络技术的日益普及和信息化建设的重视,网络硬盘作为一种新型安全的网络存储系统,已越来越受到人们的重视和喜欢。
    2011-02-02
  • asp.net UrlReWriter使用经验小结

    asp.net UrlReWriter使用经验小结

    UrlRewriter 是微软封装好了的一个URL重写组件。使用它可以让我节约很多自已开发的时间。 好了,开始讲述我的应用经验,这只是很菜鸟的经验,高手就不用看了。
    2008-11-11
  • Asp.net图片上传实现预览效果的简单代码

    Asp.net图片上传实现预览效果的简单代码

    这篇文章介绍了Asp.net图片上传实现预览效果的简单代码,有需要的朋友可以参考一下
    2013-07-07

最新评论