從POST的資料流中提取引數和檔案

2021-09-05 22:56:14 字數 1543 閱讀 4193

無奈之下,想到了乙個下下策,那就是通過分析接受到的輸入流,從中提取想要的資料。比如我在上文中提到的資料(兩個引數,乙個檔案)

實現思路:讀取輸入流,通過非檔案部份的分析,確定檔案在整個流中的位置和大小,再對輸入流重新讀取以得到檔案。

看上面的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...