2010-07-20 3 views
2

У меня есть необработанный форм-данные, которые выглядят так:.Как разобрать необработанные данные POST в массив?

------------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'] 

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

+0

Возможный обман http://stackoverflow.com/questions/3290132/read-post-request-parameters-properly-in-php-for-request-more-than-1450-b – fabrik

+0

@fabrik Нет, в вопрос, который вы связали, очень отличается. И это тоже мой вопрос. Пожалуйста, прочтите более внимательно. –

+0

Я видел, что это тоже ваш вопрос. Одна вещь, которую я не вижу: разница. Оба вопроса требуют прочитать эти значения. – fabrik

ответ

1
$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.

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

+0

Лучше всего взорвать строку новыми строками, затем перенести первую строчку в качестве границы, большую часть времени вы не узнаете границы! - ragards to cf/nl попробуйте зарезервировать новые строки 'str_replace (array (" \ r "," \ n ")," \ r \ n ", $ string);' – RobertPitt

+0

все равно испорчено, должно быть 'preg_split ("/ - + $ border /", $ data) 'вместо взрыва. замена новых строк не кажется разумной, так как вы также будете изменять контент. Но опять же вся настройка разбора этого вручную неверна. – mvds

1

Тип содержимого общего документа: multipart, причем части разделены данной границей.

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

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

0

Я сам столкнулся с подобной проблемой и написал свою собственную версию кода mvds для работы с бинарными файлами. Here's the thread для справок в дальнейшем.

Смежные вопросы