Как извлечь данные файла из сообщения HTTP MIME в Linux? - PullRequest
2 голосов
/ 21 ноября 2010

У меня есть программа, которая принимает 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-

Ответы [ 5 ]

2 голосов
/ 21 ноября 2010

Вы хотите сделать это, когда файл переходит, или это то, что вы хотите сделать после того, как файл переходит?

Практически любой язык сценариев должен работать.Мой 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, потому что вы хотите установить state в1 после того, как вы увидите application/octet-stream.

Конечно, будучи Unix, вы можете передать вывод вашей программы через awk, а затем сохранить файл.

2 голосов
/ 21 ноября 2010

Если вы используете Python, email.parser.Parser позволит вам проанализировать составной документ MIME.

1 голос
/ 21 ноября 2010

Посмотрите на Mime :: Tools suite для Perl. У него богатый набор классов; Я уверен, что вы могли бы собрать что-то в несколько строк.

1 голос
/ 21 ноября 2010

Это может быть сумасшедшей идеей, но я бы попробовал удалить заголовки с помощью procmail.

0 голосов
/ 21 ноября 2010

Это, вероятно, содержит некоторые опечатки или что-то, но все равно терпите меня. Сначала определите границу (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' удаляет последнюю строку (границу).

После этого вы ждете, пока Деннис (см. Комментарии) оптимизирует его, и вы получите это:

sed "1,/$fd/d;/^$/d;/$boundary/,$d"

Теперь, когда вы пришли сюда, поцарапайте все это и сделайте то, что предложил Игнасио. Причина - это, вероятно, не будет работать (надежно) для этого, так как GIF - это двоичные данные.

Ах, это было хорошее упражнение! В любом случае, для любителей sed вот отличная страница:

Выдающаяся информация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...