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

简介:

按理,Form提交的数据,无论是application/x-www-form-urlencoded还是multipart/form-data(有附件时),都可在服务端通过Request.Form["name"]和Request.Files["name"]获取到参数和上传的文件。模拟的POST请求也一样。但有时可能模拟POST数据格式不是很标准(可能吧,没太细研究),在服务端是获取不到数据的。最近就遇到了这么一个麻烦的事,数据是一个合作方通过模拟POST的。

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

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

看上面的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();

 

代码

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

关键字:模拟POST,模拟上传文件,multipart/form-data,Request.Form,Request.Files,从流中读取参数和文件
http://chy710.cnblogs.com

 

本文转自chy710博客园博客,原文链接:http://www.cnblogs.com/chy710/archive/2010/02/25/1673724.html ,如需转载请自行联系原作者
相关文章
|
30天前
|
开发工具
,这个问题可能是由于模型加载失败或者音频文件格式不正确导致的
,这个问题可能是由于模型加载失败或者音频文件格式不正确导致的
11 1
|
11月前
|
JSON 文字识别 API
ocr表格识别返回的json结果,转成excel,这个转化有对应的逻辑代码吗?
ocr表格识别返回的json结果,转成excel,这个转化有对应的逻辑代码吗?
402 0
|
存储 算法 索引
RLE格式分割标注文件表示
RLE格式分割标注文件表示
863 0
|
1月前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收
|
8月前
|
XML 存储 JSON
文本数据交换格式 -- JSON
文本数据交换格式 -- JSON
52 0
|
8月前
|
算法 Linux Python
SGAT丨hapmap 格式hmp.txt文件转换,基因型和表型文件样品关联筛选提取的快速方法
SGAT丨hapmap 格式hmp.txt文件转换,基因型和表型文件样品关联筛选提取的快速方法
|
9月前
|
JSON 数据格式 索引
03-Httprunner-JMESPath提取返回结果
03-Httprunner-JMESPath提取返回结果
|
9月前
|
网络协议
为什么机台上报的文件是文本类型?
成百上千的机台每天都在上传大量的文件,各种量测数据,多数都以文本文件上传到文件服务器上,为什么要选择文本类型的文件上传到服务器呢?
25 0
|
9月前
|
SQL JavaScript 关系型数据库
API接口获得数据后处理JS数组(包含字符串对象)分组、过滤和筛选的解决方案
API接口获得数据后处理JS数组(包含字符串对象)分组、过滤和筛选的解决方案
114 0
|
10月前
|
JSON 前端开发 Java
springMVC自定义的消息转换器解决格式转化
springMVC自定义的消息转换器解决格式转化
63 0