15赞
974
当前位置:  开发笔记 > 编程语言 > 正文

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

按理,Form提交的数据,无论是applicationx-www-form-urlencoded还是multipartform-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(); >

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

推荐阅读
  • 通过Java 程序获取Word中指定图片的坐标位置
    本文介绍通过Java程序获取Word文档中指定图片的坐标位置,程序运行环境是jdk1.8开发环境idea,通过java程序代码给大家介绍的非常详细,需要的朋友参考下吧 ... [详细]
  • Java数据结构之哈夫曼树概述及实现
    文中详细讲了关于Java哈夫曼树的概述以及用Java实现的方法,对各位正在学习java数据结构的小伙伴们有很大的帮助哟,需要的朋友可以参考下 ... [详细]
  • Java数据结构之单链表详解
    在之前的学习中,我们主要了解了很多Java的基本语法,但是在之后的Java学习中,了解基础数据结构的知识非常重要,数据结构的思想可以帮助我们更加清晰明白的了解Java的解题思路等等.今天我们就来开始学习实现一个Java基础的单链表,需要的朋友可以参考下 ... [详细]
  • wordpress程序是用PHP语言写成的。WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的。 ... [详细]
  • wordpress网站更换主题:登录WordPress后台,在后台中找到外观-主题,可以使用WordPress自带的主题,也可以自己上传安装,可以在后台直接上传然后安装。 ... [详细]
  • WordPress主题本地安装的方法:首先登录WordPress后台;然在后台菜单栏的外观中找到主题;接着点击“安装主题”可以搜索和在线安装主题,也可以到网上下载主题,解压后直接复制到themes文件夹中即可。 ... [详细]
  • docker环境安装WordPress的方法:首先通过docker命令行创建一个mariadb数据库;然后通过命令下载WordPress;接着使用命令查看IP;最后使用浏览器打开此IP地址,即可访问后台安装程序进行安装。 ... [详细]
  • WordPress适配手机端可以通过插件来实现,安装插件“WordPressmobilethemes”并启用,下载并安装手机端主题,然后到网站后台设置主题应用于移动端。 ... [详细]
  • wordpress仿站:先将目标网站抓取下来,可以使用工具进行抓取,将文件保存到wp-contenttust,然后建立标准的wp文件,然后对文件进行分割和修改。 ... [详细]
  • 进入WordPress博客后台,找到widgets小工具,将Text工具拖入侧边栏,展开Text直接将广告代码粘贴进去保存即可。 ... [详细]
devbox
LIU在笑_139
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有 京ICP备19059560号-4