程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> ASP.NET基礎 >> asp.net 從POST的數據流中提取參數和文件

asp.net 從POST的數據流中提取參數和文件

編輯:ASP.NET基礎
模擬的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();

注:這個方法有一定的風險,就是對文件的大小和位置的確定,一定要計算准確,對輸入流的分析要想周到全面;還有當上傳文件為多個時,這個方法就麻煩了...如果你有更好的方法,可留言交流。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved