asp.net 從POST的數(shù)據(jù)流中提取參數(shù)和文件
無(wú)奈之下,想到了一個(gè)下下策,那就是通過(guò)分析接受到的輸入流,從中提取想要的數(shù)據(jù)。比如我在上文中提到的數(shù)據(jù)(兩個(gè)參數(shù),一個(gè)圖片文件)
實(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)注意客戶(hù)端POST時(shí)使用何種編碼:
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ù)的值可以在這里得到了。
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)該是固定的)。注意有換行回車(chē)符。
這樣,文件之外的部份在整個(gè)流中的大小可以確定,也就是說(shuō)文件在整個(gè)流中的位置和大小也確定了。那么通過(guò)對(duì)原始流的重新讀取就可以得到文件部份。如果文件是文本類(lèi)型的,可以不用這樣,直接跟參數(shù)部份一樣分析獲取。
//保存文件
FileStream fss = new FileStream("path", FileMode.Create);
fss.Write(input, headLength, input.Length-headLength-footLength);
fss.Close();
代碼
//得到文件字節(jié)數(shù)組
byte[] imgcont = new byte[input.Length - headLength-footLength];
MemoryStream ms = new MemoryStream(input);
//光標(biāo)移動(dòng)到文件開(kāi)始處
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è)方法就麻煩了...如果你有更好的方法,可留言交流。
相關(guān)文章
asp.net 1.1/ 2.0 中快速實(shí)現(xiàn)單點(diǎn)登陸
asp.net 1.1/ 2.0 中快速實(shí)現(xiàn)單點(diǎn)登陸...2007-04-04ASP.NET使用HttpWebRequest讀取遠(yuǎn)程網(wǎng)頁(yè)源代碼
本文分享了一個(gè)使用HttpWebRequest讀取遠(yuǎn)程網(wǎng)頁(yè)的案例,供大家參考學(xué)習(xí)。2016-03-03ASP.NET MVC從控制器傳遞數(shù)據(jù)到視圖的四種方式詳解
本篇文章主要介紹了ASP.NET MVC從控制器傳遞數(shù)據(jù)到視圖的四種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01.net 通過(guò)URL推送POST數(shù)據(jù)具體實(shí)現(xiàn)
這篇文章主要介紹了.net 通過(guò)URL推送POST數(shù)據(jù)具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12.Net?Core讀取文件時(shí)中文亂碼問(wèn)題的解決方法分享
所以關(guān)于讀取文件亂碼的問(wèn)題,百度上有很多方案,這里再給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于.Net?Core讀取文件時(shí)中文亂碼問(wèn)題的解決方法,需要的朋友可以參考下2022-02-02ASP.NET頁(yè)面優(yōu)化 性能提升8倍的方法
今天與大家分享:一種優(yōu)化頁(yè)面執(zhí)行速度的方法。采用這個(gè)方法,可以使用頁(yè)面的執(zhí)行速度獲得【8倍】的提升效果2012-03-03ASP.NET?Core框架探索之Authentication的權(quán)限認(rèn)證過(guò)程解析
這篇文章主要介紹了ASP.NET?Core框架探索之Authentication的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03asp.net B2B網(wǎng)站對(duì)接支付寶接口
首先,網(wǎng)上購(gòu)物系統(tǒng)必須與支付寶公司簽訂合作協(xié)議,以確保從本購(gòu)物網(wǎng)站上傳到2010-06-06