簡體   English   中英

如何在Linux中從HTTP MIME編碼的消息中提取文件數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM