国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

asp.net 從POST的數(shù)據(jù)流中提取參數(shù)和文件

2024-07-10 13:26:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
模擬的POST請(qǐng)求也一樣。但有時(shí)可能模擬POST數(shù)據(jù)格式不是很標(biāo)準(zhǔn)(可能吧,沒太細(xì)研究),在服務(wù)端是獲取不到數(shù)據(jù)的。最近就遇到了這么一個(gè)麻煩的事,數(shù)據(jù)是一個(gè)合作方通過(guò)模擬POST的。

無(wú)奈之下,想到了一個(gè)下下策,那就是通過(guò)分析接受到的輸入流,從中提取想要的數(shù)據(jù)。比如我在上文中提到的數(shù)據(jù)(兩個(gè)參數(shù),一個(gè)圖片文件)

asp.net 從POST的數(shù)據(jù)流中提取參數(shù)和文件

實(shí)現(xiàn)思路:讀取輸入流,通過(guò)非文件部份的分析,確定文件在整個(gè)流中的位置和大小,再對(duì)輸入流重新讀取以得到文件。

看上面的POST數(shù)據(jù),參數(shù)部分及分隔符等,說(shuō)白了都是些字符串。基本上都是英文數(shù)字符號(hào)等,如有中文發(fā)送之前可做一下編碼,這樣基本上可以確保不會(huì)因編碼問(wèn)題造成計(jì)算失誤(英文字符各編碼都是相同的)。這一部分內(nèi)容(非文件部分,文件部分是二進(jìn)制格式來(lái)的,千萬(wàn)別這樣去做)可以得到。
通過(guò)接受輸入的流轉(zhuǎn)成字符串,如果參數(shù)中有中文,請(qǐng)注意客戶端POST時(shí)使用何種編碼:

復(fù)制代碼 代碼如下:


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


然后通過(guò)正則表達(dá)式,匹配上面的非文件部份內(nèi)容,此處略,再把得到的內(nèi)容轉(zhuǎn)成byte[],計(jì)算出它的長(zhǎng)度。參數(shù)的值可以在這里得到了。

復(fù)制代碼 代碼如下:


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


同理計(jì)算出結(jié)尾出"-----------------------------7da119c1004a6--"的長(zhǎng)度(這個(gè)每次請(qǐng)求應(yīng)該是固定的)。注意有換行回車符。

這樣,文件之外的部份在整個(gè)流中的大小可以確定,也就是說(shuō)文件在整個(gè)流中的位置和大小也確定了。那么通過(guò)對(duì)原始流的重新讀取就可以得到文件部份。如果文件是文本類型的,可以不用這樣,直接跟參數(shù)部份一樣分析獲取。

復(fù)制代碼 代碼如下:


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



代碼

復(fù)制代碼 代碼如下:


//得到文件字節(jié)數(shù)組
byte[] imgcont = new byte[input.Length - headLength-footLength];
MemoryStream ms = new MemoryStream(input);
//光標(biāo)移動(dòng)到文件開始處
ms.Seek(headLength,SeekOrigin.Begin);
ms.Read(imgcont, 0, imgcont.Length);
ms.Close();


注:這個(gè)方法有一定的風(fēng)險(xiǎn),就是對(duì)文件的大小和位置的確定,一定要計(jì)算準(zhǔn)確,對(duì)輸入流的分析要想周到全面;還有當(dāng)上傳文件為多個(gè)時(shí),這個(gè)方法就麻煩了...如果你有更好的方法,可留言交流。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鹿邑县| 神农架林区| 麦盖提县| 遵义市| 芒康县| 孟州市| 个旧市| 麻阳| 个旧市| 荣成市| 武平县| 密云县| 威海市| 长垣县| 英德市| 凤凰县| 韶山市| 大英县| 昆山市| 黄浦区| 海伦市| 双桥区| 东兰县| 广州市| 财经| 中方县| 永吉县| 巴中市| 永吉县| 巴东县| 连山| 峨眉山市| 满城县| 闵行区| 沈丘县| 林西县| 河北区| 浦县| 新田县| 临江市| 沧州市|