[英]How to extract file data from an HTTP MIME-encoded message in Linux?
我有一個程序接受HTTP發布文件並將所有POST結果寫入文件,我想編寫一個腳本來刪除HTTP標頭,只保留二進制文件數據,該怎么辦?
文件內容如下( Content-Type: application/octet-stream
和------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3
之間的數據是我想要的:
POST /?user_name=vvvvvvvv&size=837&file_name=logo.gif& HTTP/1.1^M
Accept: text/*^M
Content-Type: multipart/form-data; boundary=----------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3^M
User-Agent: Shockwave Flash^M
Host: 192.168.0.198:9998^M
Content-Length: 1251^M
Connection: Keep-Alive^M
Cache-Control: no-cache^M
Cookie: cb_fullname=ddddddd; cb_user_name=cdc^M
^M
------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3^M
Content-Disposition: form-data; name="Filename"^M
^M
logo.gif^M
------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3^M
Content-Disposition: form-data; name="Filedata"; filename="logo.gif"^M
Content-Type: application/octet-stream^M
^M
GIF89an^@I^^M
------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3^M
Content-Disposition: form-data; name="Upload"^M
^M
Submit Query^M
------------KM7cH2GI3cH2Ef1Ij5gL6GI3Ij5GI3-
如果您使用Python, email.parser.Parser
將允許您解析多部分的MIME文檔。
您要在文件移交時執行此操作,還是在文件移交后執行此操作?
幾乎所有腳本語言都可以使用。 我的AWK有點生銹,但是...
awk '/^Content-Type: application\/octet-stream/,/^--------/'
那應該打印application/octet-stream
和----------
行之間的所有內容。 它還可能同時包含這兩行,這意味着您必須做一些更復雜的事情:
BEGIN {state = 0}
{
if ($0 ~ /^------------/) {
state = 0;
}
if (state == 1) {
print $0
}
if ($0 ~ /^Content-Type: application\/octet-stream/) {
state = 1;
}
}
application\\/octet-stream
行在print語句之后,因為您希望在看到application/octet-stream
之后將state
設置為1
。
當然,作為Unix,您可以通過awk通過管道傳輸程序的輸出,然后保存文件。
這可能是一個瘋狂的主意,但我會嘗試使用procmail剝離標頭。
查看Perl的Mime :: Tools套件 。 它具有豐富的類集; 我敢肯定,您可以將幾行內容放在一起。
這可能包含一些錯別字或其他內容,但還是請耐心等待。 首先確定邊界(如果需要, input
是包含數據的文件-管道):
boundary=`grep '^Content-Type: multipart/form-data; boundary=' input|sed 's/.*boundary=//'`
然后過濾Filedata
部分:
fd='Content-Disposition: form-data; name="Filedata"'
sed -n "/$fd/,/$boundary/p"
最后一部分是過濾一些額外的行-空行和邊界本身之前的標題行,包括邊界,因此將最后一行從上一行更改為:
sed -n "/$fd/,/$boundary/p" | sed '1,/^$/d' | sed '$d'
sed -n "/$fd/,/$boundary/p"
過濾Filedata
標頭和邊界(包括邊界)之間的線, sed '1,/^$/d'
刪除直到第一行,包括第一行的所有內容(因此刪除標題),並且 sed '$d'
刪除最后一行(邊界)。 之后,您等待Dennis(請參閱評論)對其進行優化,然后得到以下信息:
sed "1,/$fd/d;/^$/d;/$boundary/,$d"
既然您已經來到這里,請抓緊所有內容並按照Ignacio的建議進行操作。 原因-因為GIF是二進制數據,所以這可能不會(可靠地)起作用。
啊,這是很好的鍛煉! 無論如何,對於sed
愛好者來說,這是一個很棒的頁面:
出色的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.