無奈之下,想到了乙個下下策,那就是通過分析接受到的輸入流,從中提取想要的資料。比如我在上文中提到的資料(兩個引數,乙個檔案)
實現思路:讀取輸入流,通過非檔案部份的分析,確定檔案在整個流中的位置和大小,再對輸入流重新讀取以得到檔案。
看上面的post資料,引數部分及分隔符等,說白了都是些字串。基本上都是英文數字符號等,如有中文傳送之前可做一下編碼,這樣基本上可以確保不會因編碼問題造成計算失誤(英文本元各編碼都是相同的)。這一部分內容(非檔案部分,檔案部分是二進位制格式來的,千萬別這樣去做)可以得到。
通過接受輸入的流轉成字串,如果引數中有中文,請注意客戶端post時使用何種編碼:
byte
input
=request.binaryread(request.totalbytes);
string
source
=encoding.utf8.getstring(input);
然後通過正規表示式,匹配上面的非檔案部份內容,此處略,再把得到的內容轉成byte,計算出它的長度。引數的值可以在這裡得到了。
regex rginput
=new
regex("略
");if(rginput.ismatch(source))
同理計算出結尾出"-----------------------------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();
關鍵字:模擬post,模擬上傳檔案,multipart/form-data,request.form,request.files,從流中讀取引數和檔案
從非標準的POST資料流中提取檔案
1 接收資料流轉成字串,注意編碼 byte recv request.binaryread request.totalbytes string sourcebyte encoding.utf8.getstring recv 2 確認檔案流在整個資料流的起止位置 比如 找到檔案在位元組流中的起止位置 ...
c 之從標準流中提取文字資料
istream istream get char int char n istream istream getline char int char n 作用 從文字中提取指定個數的字元,並在串陣列末新增乙個空字元 其中,第乙個引數指向接受字元資料的字元陣列 第二個引數指定字元陣列最多可容納的字元個數...
從Wireshark監聽的資料中提取需要的資料
最近,需要將wireshark監聽的資料進行提取,分兩步 首先,應該得出wireshark的資料報吧,在圖形化介面中可以非常直觀的將監聽資料進行儲存,但是這樣需要手動操作非常麻煩,而且容易出錯 隨著處理資料報的數量增加,圖形化可能吃不消,以前就遇見過 在linux下,採用了tshark命令,tsha...