У меня есть исходные данные формы, которые выглядят так:
------------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']
и так далее с данными внутри?
$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... } }
вуаля.
отредактируйте: вы также должны обрезать новую rtrim
из каждого блока контента, но rtrim
будет нарезать несколько rtrim
новой строки, поэтому вам нужно сделать немного более творческим.
Тип содержимого общего документа является multipart
, причем части разделяются данной границей.
Каждая часть или сообщение внутри многостраничного документа находится в стандартном формате сообщения: строки заголовка, за которым следует пустая строка, за которой следует последовательность байтов, представляющих содержимое этой части. И HTTP, и SMTP работают так.
С заголовками, такими как Content-Disposition: form-data; name="title"
Content-Disposition: form-data; name="title"
, вы должны быть осторожны с name
потому что он может быть закодирован (подумайте о том, как представить произвольное значение, например, такое, которое содержит метку двойной кавычки или новую строку).
Я сам столкнулся с подобной проблемой и написал собственную версию кода mvds, чтобы работать с бинарными файлами. Вот ссылка для дальнейшего использования.