САМОУЧИТЕЛЬ PHP 4



         

Формат данных - часть 2


Например, пусть у нас есть форма:

Листинг 3.7. Multipart-форма

<form action=... enctype=multipart/form-data method=post>

Name: <input type=text name="Name" value="Ìîå èìÿ"><br>

Box: <input type=checkbox name="Box" value=1 checked><br>

Area: <input type=textarea name="Area">Ýòî êàêîé-òî òåêñò</textarea><br>

<input type=submit>

</form>

Данные, поступившие по нажатии кнопки submit на сервер, будут иметь

следующий вид:

----------------127462537625367\n

Content-Disposition: form-data; name="Name"\n

\n

Ìîå èìÿ\n

----------------127462537625367\n

Content-Disposition: form-data; name="Box"\n

\n

1\n

----------------127462537625367\n

Content-Disposition: form-data; name="Area"\n

\n

Ýòî êàêîé-òî òåêñò\n

Заметьте, что несколько дефисов и число (которое мы ранее назвали

Идентификатор_начала) предшествуют каждому блоку. Более того, строка из дефисов и этого числа служит своеобразным маркером, который разделяет блоки. Очевидно, эта строка должна быть уникальной во всех данных. Именно так ее и формирует браузер. Правда, сказанное означает, что сегодня идентификатор будет одним, а завтра, возможно, совсем другим. Так что нам придется, прежде чем анализировать данные, считать этот идентификатор в буфер (им будет последовательность символов до первого символа \n).

Стандарт протокола HTTP говорит нам, что идентификатор начала также должен быть доступен через одну из переменных окружения. Но я не помню и не хочу знать ее название — сейчас объясню, почему. Некоторые браузеры (особенно старые) путают этот идентификатор и присылают его неправильно — с двумя предшествующими минусами (а остальные — без них), так что сценарии, не рассчитывающие на такой подвох, перестанут работать. Никогда не полагайтесь на эту переменную окружения (даже если узнаете, как она называется)! Вместо этого читайте последовательность символов до первого перевода строки и воспринимайте именно ее как разделитель.

Далее алгоритм разбора должен быть следующим: в цикле мы пропускаем символы идентификатора и перевода строки, извлекаем подстроку имя="что-то"

(не обращая внимания на Content-Disposition), дожидаемся двух символов перевода строки и затем считаем значением соответствующего поля все те данные, которые размещены до строки \nИдентификатор

(или же до конца, если такой строки больше нет). Как видите, все довольно просто.

Стандарт HTTP предписывает, чтобы перевод строки содержал два символа — \r\n, а не один \n. Как вы уже, наверное, чувствуете, существуют браузеры, которые об этом и не догадываются и посылают только один \n. Так что, будьте готовы к тому, чтобы правильно обрабатывать и эту ситуацию.




Содержание  Назад  Вперед