Как разобрать необработанные данные POST в массив? - PullRequest
2 голосов
/ 20 июля 2010

У меня есть необработанные данные формы, которые выглядят так:

------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="intro"

O
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="title"

T
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="apiKey"

98d32fdsa
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="method"

/media/add
------------V2ymHFg03ehbqgZCaKO6jy
Content-Disposition: form-data; name="upload_field"; filename="original_filename.png"
Content-Type: image/png


------------V2ymHFg03ehbqgZCaKO6jy--

(Вместо второй строки поля upload_field есть данные этого файла (невидимые здесь). Поэтому мой вопрос:

Как разобрать вышеуказанные данные, чтобы получить таблицу:

$result['intro'] 

и так далее с данными внутри?

Ответы [ 3 ]

1 голос
/ 20 июля 2010

Тип содержимого всего документа: multipart, при этом части разделяются заданной границей.

Каждая часть или сообщение в многочастном документе имеет стандартный формат сообщения: заголовокстроки, за которыми следует пустая строка, за которой следует последовательность байтов, представляющих содержимое этой части.И HTTP, и SMTP работают следующим образом.

С такими строками заголовка, как Content-Disposition: form-data; name="title", вы должны быть осторожны с name, потому что он может быть закодирован (подумайте о том, как представить произвольное значение, например, однос двойной кавычкой или переводом строки).

1 голос
/ 20 июля 2010
$boundary = "------------V2ymHFg03ehbqgZCaKO6jy"; // take this from content-type
$rawfields = explode($boundary,$data);
array_pop($rawfields); // drop the last -- piece
foreach ( $rawfields as $id=>$block )
{
    list($mime,$content) = explode("\r\n\r\n",$block,2); // I think it's <cr><lf> by standards, maybe check!
    if ( preg_match('/name="([^"]*)"/i',$mime,$match) )
    {
        $result[$match[1]] = $content;
        // todo: do funky stuff with other fields
    } else {
        $result[] = $content; // just in case...
    }
}

presto.

edit: Вы также должны обрезать новую строку из каждого блока контента, но rtrim будет прерывать более одной новой строки, поэтому вам нужно получитьнемного более креативно.

0 голосов
/ 30 марта 2011

Я сам имел дело с подобной проблемой и написал свою собственную версию кода mvds для работы с двоичными файлами. Вот ветка для дальнейшего использования.

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