Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

 
liveinternet.ru: показано количество просмотров и посетителей

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
компьютера 
пользо-

Часть I. Основы Web-программирования 64 
вателя на сервер. Для этого в языке HTML предусмотрены специальные средства. 
Рассмотрим их подробнее. 
Формат данных 
В свое время я говорил, что все данные из формы при передаче их на сервер 
упако- 
вываются в строку при помощи символов ?, & и =. Легко видеть, что при загрузке 
файлов такой способ, хотя и приемлем, но будет существенно увеличивать размер 
передаваемой информации. Действительно, ведь большинство файлов — бинарные, а 
мы знаем, что при URL-кодировании данные таких файлов сильно "распухают" — 
примерно в три раза (например, простой нулевой байт при URL-кодировании превра- 

тится в %00). Это сильно замедлит передачу и увеличит нагрузку на канал. И вот, 
от- 
части специально для решения указанной проблемы был изобретен другой формат 
передачи данных, отличный от того, который мы до сих пор рассматривали. 
В нем уже не используются пресловутые символы ? и &. Кроме того, похоже, в 
случае 
применения такого формата передачи может быть задействован только метод POST, 
но не метод GET. Нас это вполне устроит — ведь файлы обычно большие, и достав- 
лять их через GET вряд ли разумно... 
Если нужно указать браузеру, что в какой-то форме следует применять другой 
формат 
передачи, следует в соответствующем тэге 
задать атрибут enctype=multipart/form-data. (Кстати говоря, если этот атрибут не указан, то форма считается обычной, что эквивалентно enctype=application/x-www-formurlencoded — именно так обозначается привычный нам формат передачи.) После этого данные, поступившие от нашей формы, будут выглядеть как несколько блоков информации (по одному на элемент формы). Каждый такой блок очень напоминает HTTP-формат "заголовки-данные", используемый при традиционном формате пере- дачи. Выглядит блок примерно так (\n, как всегда, обозначает символ перевода стро- ки): -----------------Идентификатор_начала\n Content-Disposition: form-data; name="имя"\n \n значение\n Например, пусть у нас есть форма: Листинг 3.7. Multipart-форма Name:
Box:
Area: Это какой-то текст
Глава 3. CGI изнутри 65
Данные, поступившие по нажатии кнопки 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 говорит нам, что идентификатор начала также дол- жен быть доступен через одну из переменных окружения. Но я не помню и не хочу знать ее название — сейчас объясню, почему. Некоторые браузеры (осо- бенно старые) путают этот идентификатор и присылают его неправильно — с двумя предшествующими минусами (а остальные — без них), так что сцена- рии, не рассчитывающие на такой подвох, перестанут работать. Никогда не полагайтесь на эту переменную окружения (даже если узнаете, как она назы- вается)! Вместо этого читайте последовательность символов до первого пере- вода строки и воспринимайте
 
<<-[Весь Текст]
Страница: из 287
 <<-