Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

В случае, если имя вашего компьютера отлично от localhost, то нужно заменить это слово на имя компьютера




Замечание

После нажатия клавиши <Enter> в окне браузера должна появиться страница, приведенная на рис. 9.1.

Рис. 9.1. Динамически сгенерированная страница Она имеет HTML-код, приведенный в листинге 9.2.

Листинг 9.2. HTML-код полученной страницы;

<HTML>

<ТIТLЕ>Это динамически сгенерированная страница</ТIТLЕ>

<Hl>Hello World!</Н1>

</HTML>

Рассмотрим исходный код программы (листинг 9.1) подробнее. Строка {$APPTYPE CONSOLE) означает, что программа должна работать как консольное приложение. Такой тип программ работает подобно обычным программам, написанным для работы в текстовом режиме ДОС, но может использовать реестр, системную оболочку Windows, драйверы баз данных и т. д. Как отмечалось ранее, все серверные модули, использующие CGI, работают только в консольном виде. Оператор

writeln('Content-Type: text/html')

посылает в стандартный поток вывода строку, которая сообщает серверу, что последующее содержимое файла является HTML-документом и может быть отправлено клиенту в виде такового. Обратите внимание, что при запуске этой страницы на экране не появилось никаких новых окон с сообщениями. Консоль эмулируется Web-сервером. Это значит, что программа выводит данные обычными методами, как будто на экран пользователя. При этом вместо экрана все сообщения считываются сервером, а затем обрабатываются. Оператор writeln без параметров вставляет пустую строку для того, чтобы отделить содержимое документа от заголовка, указывающего тип содержимого.

Очевидно, что последующие операторы выводят код страницы, что легко увидеть в листинге 9.2.

Разумеется, что получаемая страница всегда будет иметь одно и то же содержание, т.е. будет статична, однако генерируется она динамическими средствами: каждый раз, при обращении по вышеуказанному адресу, будет запускаться модуль hello.exe, и результаты его работы будут выведены на экран клиента.

Поскольку основной целью книги является демонстрация, прежде всего практического использования CGI, в качестве примера создадим серверный модуль, который при регистрации пользователя в базе данных получает от него информацию в виде заполненной анкеты, а затем выводит полученную информацию в виде Web-страницы на экран, позволяя клиенту подтвердить ее, или внести какие-нибудь коррективы.

 

Получение данных от клиента

Существует несколько способов передачи содержимого форм Web-страниц клиента серверному модулю, но наиболее распространенными являются POST и GET. Оба этих метода используют переменные окружения. Переменные окружения это набор именованных данных, хранящихся в зарезервированной области памяти. Если вы когда-нибудь настраивали файл autoexec.bat, то наверняка помните, что для установки, например, путей PATH к файлам использовалась процедура SET, как раз и работающая с этими переменными.

 

Работа с переменными окружения

Поскольку каждый запрос на обработку данных содержит сопроводительную информацию, то для любого запускаемого экземпляра серверного модуля Web-сервером создается собственный набор данных, содержащихся в переменных окружения. Через них передается информация о расположении запускаемого файла на жестком диске сервера, о методе передачи клиентских данных и т. д.

К сожалению, несмотря на то, что набор этих переменных ограничен, различные серверы передают свои наборы переменных. Некоторые из них все же достаточно широко поддерживаются производителями Web-серверов. В табл. 9.1 представлен список имен переменных, часть из которых используется всеми серверами, а некоторые наоборот встречаются редко.

Таблица 9.1. Переменные окружения серверного модуля

Имя переменной Краткое описание
REQUEST_METHOD Метод запроса (POST или GET)
SERVER_PROTOCOL Протокол, используемый сервером (как правило, HTTP 1.0)
URL URL, запрашиваемый у сервера
QUERY_STRING Строка запроса в методе GET
PATH_INFO Дополнительный путь, содержащийся в URL, после названия модуля
PATH_TRANSLATED Информация о физическом расположении серверного модуля на диске сервера
CONTENT_LENGTH Количество символов в данных, передаваемых стандартным потоком ввода при использовании метода POST
CONTENT_TYPE Тип содержимого запроса. Это могут быть несколько MIME-типов, которые будут рассмотрены позже
GATEWAY_INTERFACE Тип протокола CGI, используемого сервером
REMOTE_ADDR IP-адрес клиента
REMOTE_ HOST Если в системе DNS этому адресу сопоставлено доменное имя, то данная переменная обеспечивает доступ к нему
SCRIPT NAME Название скрипта
SCRIPT_FILENAME Имя файла скрипта, указанного в запросе
SERVER _NAME DNS-имя сервера
SERVER_PORT Порт сервера, который обслуживает протокол HTTP
SERVER _SOFTWARE Название программы — Web-сервера
AUTH_TYPE Тип аутентификации (если таковая определена для доступа пользователей к документам)

 

REMOTE_USER При условии использования аутентификации пользователей, переменная содержит имя клиента, который обратился к данному экземпляру серверного скрипта
HTTP_CACHE_CONTROL Информация о поддержке управления кэша Web-сервера
HTTP_ DATE Дата и время запроса
HTTP_REFERER Адрес страницы, с которой перешел пользователь
HTTP_ACCEPT Информация о типе данных, которые могут быть посланы скриптом в качестве ответа
HTTP_FROM Аналогично REMOTE_ ADDR
HTTP_HOST Аналогично REMOTE_HOST
HTTP_COOKIE Содержимое поля cookie в строке запроса
HTTP_AUTHORIZATION Аналогично AUTH _TYPE
HTTP_CONNECTION Обеспечивает возможность удерживать долговременное HTTP-соединение с клиентом, что позволяет не запускать серверный скрипт для каждого запроса данного пользователя и немного иначе организовать обмен данными
HTTP_USER_AGENT Название и марка браузера клиента

Не существует иных методов узнать, какие именно переменные окружения поддерживает конкретный Web-сервер, кроме как поискать в документации, либо непосредственно проверить. В начале выполнения любого проекта, предполагающего программирование серверных скриптов, желательно провести такую проверку. В гл. 5 мы запланировали использование в качестве сервера Apache. Давайте определим проверкой, какие переменные мы сможем в дальнейшем использовать (листинг 9.3).

Листинг 9.3. Проверка переменных

program envir;

{$APPTYPE CONSOLE}

uses

Windows;

const

CGIVar: array[0..27] of string =

CREQUEST_METHOD',

'SERVER_PROTOCOL',

'URL',

// Для экономии места, здесь опущены переменные, приведенные в таблице //...

'НТТР_СООКIЕ',

'HTTP_AUTHORIZATION');

var

buffer:array[0..4095] of Char;

count:byte;

size:integer;

begin

writeln('Content-Type: text/html');

writeln;

writeln('<HTML>');

writeln('<ТIТLЕ>Список переменных и их значений, передаваемых скрипту Web-сервером Apache</TITLE>');

writeln('<Н4>Список переменных и их значений, передаваемых скрипту Web-сервером Apache</H4>');

for count:=0 to 27 do

begin

size:=GetEnvironmentVariable(Pchar(CGIvar[count]),Buffer, SizeOf(Buffer));

if size>l then writeln(CGIvar{count],'=',Buffer,'<BR>')

end;

writeln('</HTML>');

end.

Рассмотрим приведенный листинг. Подключаемый модуль Windows необходим для использования функции GetEnvironmentVariabie, которая и обеспечивает доступ к переменным окружения. Ее параметрами являются:

  • нуль-терминованная строка, содержащая имя переменной окружения;
  • символьный массив, в который помещается полученная информация;
  • число символов, которые нужно поместить из переменной окружения, имя которой указано в первом параметре, в массив возвращаемых значений (второй параметр).

Возвращаемым значением для данной функции является число, равное количеству символов, извлеченных из переменной окружения.

Скомпилируем созданную программу, и обратимся к ней в браузере. Страница, полученная в результате работы модуля, приведена на рис. 9.2.

Мы познакомились с базисом интерфейса CGI — переменными окружения. Теперь можно переходить к более детальному изучению возможностей обмена данными между клиентом и сервером.

Рис. 9.2. Список переменных окружения и их значения

 

Метод POST

Как уже было отмечено ранее, существует два различных способа передачи самого содержимого запроса от Web-сервера к серверному модулю, который должен эти данные обработать — POST и GET.

Метод POST предполагает получение серверным модулем клиентских сведений из стандартного потока ввода. При этом Web-сервер создает все те же переменные окружения с сопроводительной информацией, но при этом дополнительно посылает модулю в стандартный поток ввода само тело клиентского запроса, структура которого будет описана ниже. В дополнение к тем переменным, которые приведены на рис. 9.2, добавляется переменная CONTENT_LENGTH, содержащая число символов с клиентскими данными, которые необходимо считывать из потока ввода для последующей обработки. Если для получения данных программист использует функции вроде Readchar, которые возвращают один символ из потока ввода, то они должны вызываться то число раз, которое указано в переменной CONTENT_LENGTH. Также можно применять функции Read/Readin, поскольку сервер (по крайней мере, Apache) к концу посылаемых данных добавляет управляющий символ конца строки, что позволяет оператору программы успешно завершать чтение данных, и, следовательно, выполняться. Проще говоря, такая операция равносильна нажатию клавиши <Enter> в поле ввода строки в текстовом режиме ДОС.

Данные, посылаемые серверному модулю в потоке ввода, кодируются по следующим правилам.

  • Обычные латинские литеры не кодируются.
  • Все остальные символы, например русские буквы, а также различные знаки препинания, специальные символы заменяются шестнадцатерич-ным представлением вида: %FF. Обратите внимание, что в отличие, от языка Object Pascal, где для указания шестнадцатеричного формата числа используется знак $, в потоке, посылаемым сервером, перед hex-числом стоит знак %. Перевод в привычное представление символов осуществляется путем выделения из всего считанного содержимого блоков, состоящих из трех символов, начинающихся со знака %, после которого следует две шестнадцатеричные цифры. Удобно рассматривать эти конструкции как строки, в которых первый символ можно заменить на $, после чего перевести их в десятичное представление (с помощью функции strToint). Полученное число теперь легко сопоставить символу (функция char). Примерно такой алгоритм реализован в функции HTTPDecode библиотеки httpapp.pas, входящей в поставку клиент-серверного комплекта Delphi.
  • Поток ввода имеет следующую форму: имяэлемента1=содержимое!& имяэлемента2=содержимое2&..., где имя элемента является атрибутом name соответствующего элемента формы Web-страницы, с которой пришел запрос, а его содержимое является либо текстом, либо определенным значением value.

Методы приведения данных к стандартному виду

Реализуем серверный скрипт, который получает, а затем отображает на Web-странице некоторые анкетные данные клиента.

Аспекты, представляющие более содержательную обработку данных с использованием CGI, будет описаны в дальнейшем, а все исходные файлы доступны на дискете с примерами.

Поскольку в соответствии с проектом анкета для физических и юридических лиц отличается, то реализуем поставленную задачу в два этапа:

1. Сначала пользователь указывает тип покупателя

2. Затем, в зависимости от его выбора, ему предоставляют анкету. Начальная Web-страница будет иметь код, приведенный в листинге 9.4.

Листинг.9.4 Анкета покупателя

<HTML>

<ТIТLЕ>Анкета покупателя</ТIТLЕ>

<Н4>Укажите, пожалуйста, следующую информацию:</Н4>

<PORM action=" http:\\localhost\cgi-bin\adduser.exe" method="POST">

<Р>Ваше имя:

<INPUT type="text" maxlength=30 name="Firstname"></INPUT>

<Р>Ваша фамилия:

<INPUT type="text" maxlength=30 name="Lastname"?></INPUT>

<Р>Вы представляете юридическое лицо при оформлении покупки?

<SELECT size="l" name="jud">

<OPTION selected value="l">fla, я представляю юридическое Jumo</OPTION>

<OPTION value="0">HeT, я действую от своего имени</ОРТIOМ> </SELECT>

<INPUT type="submit" value="Отправить данные данные" name="Bl">

</FORM>

</HTML>

Если теперь заполнить формы Web-страницы значениями начиная с первого ПОЛЯ формы, введя соответственно Sergey, Podolsky, "Нет, я действую от своего имени", то поток ввода, который передается серверному модулю Web-сервером, будет иметь вид:

Firstname=%Dl%E5%FO%E3%E5%E9+%28Sergey%29&Lastname=%CF%EE %E4%EE%EB%FC%Fl% EA%E8%E9+%28Podolsky%29&jud=0 &Bl=%CE%F2%EF%FO%EO%E2%E8%F2%FC+%E4%EO%ED%ED %FB%E5.

Как видим, модулю, для того чтобы получить интересующие данные и в дальнейшем их обрабатывать, необходимо проделать следующие операции:

1. После того как данные будут считаны, например, в строку content, нужно выделять подстроки, которые начинаются с названия элемента формы, а заканчиваются символом &.

2. Из получившихся строк убрать названия полей и знак =.

3. Преобразовать строки, заменив все шестнадцатеричные представления символов на обычные, а знаки + на пробелы.

4. При необходимости некоторым строковым значениям сопоставить числовые или булевские.

Проделаем эти операции над данными элемента Lastname.

Первые два пункта можно реализовать сразу с помощью функции, приведенной в листинге 9.5.

Листинг 9.5. Выделение подстроки, содержащей данные элемента Lastname

function subst(s: string):string;

begin

subst:=copy(s, (pos('&Lastname=',s)+10), ((pos('&jud=',

s))-(pos('&Lastname=',s)+10)));

end;

Данная функция отсекает данные, введенные клиентом в поле Lastname из всей строки, полученной в качестве параметра. Обратите внимание, что в качестве параметра функции pos, которая использовалась для установления номера позиций подстрок '&Lastname=' и '&jud=', а, следовательно, начала и конца интересующей области, использовались не только названия элементов HTML-форм, но и символы, обрамляющие их в потоке ввода. Сделано это для того, чтобы предотвратить неправильную работу скрипта, в случае, если пользователь преднамеренно или нет введет названия элементов в поля для текстового ввода. Даже если ввести символы & или = вместе с названием элемента, то сервер заменит их шестнадцатеричным представлением, что обеспечит корректную работу модуля.

Следующим этапом является перевод символов в нормальный вид. Код функции russ, возвращающей преобразованную к обычному представлению строку — параметр ее вызова, приведен в листинге 9.6.

Листинг 9.6. Декодирование символов

function russ(s: string):string;

var

st:string;

begin

while length(s)>0 do

begin

if s[l]='+' then

begin

st:=Concat(st,' ');

delete (s,1,1);

end;

if s [!]<>'%' then

begin

st:=Concat(st,s[1]);

delete (s,l,l);

end

else

begin

st:=Concat(st,char(strtoint(Concat('$',s[2],s[3]))));

delete(s,1,3};

end;

end;

Result:=st;

end;

Приведенная функция последовательно "отрезает" от начала строки s, содержащей данные, которые необходимо декодировать, блок, размером один или три символа, для предварительной обработки. Если на первом месте строки стоит символ %, то следующие за ним два символа преобразуются в строковое представление шестнадцатеричного числа, с последующим переводом в тип integer и получением соответствующего символа. Преобразованные символы последовательно прибавляются к строке st. Знак + на первом месте указанного выше блока приводит к прибавлению к строке st пробела, а все остальные символы переносятся без изменений. В конце выполнения функции содержимое строки st передается переменной Result. Таким образом, мы создали весьма полезную функцию, которая может использоваться во всех серверных модулях, при необходимости декодировки данных.

Итак, все, что нам осталось сделать, — это, используя обе полученные функции, предоставить пользователю анкету в зависимости от сделанного им на первом шаге выбора. Текст программы, осуществляющей эту операцию, приведен в листинге 9.7.

Листинг 9.7. Тело программы

begin

readln(i); //i — строковая переменная

writeln('Content-Type: text/html');

writeln;

writeln('<HTML>');

writeln('<ТIТIЕ>Анкета покупателя</ТIТLЕ>');

writeln('<Р>Добрый день, уважаемый');

writeln(russ(subst(i)));

writeln('<Р>Пожалуйста, заполните анкету покупателя:');

if pos('jud=0',i)>0 then

begin

writeln('<Р>Анкета для физических лиц');

// Вывод тела анкеты для частных клиентов

//...

end

else

begin

writeln('<Р>Анкета для юридических лиц');

//Вывод тела анкеты для юридических лиц //...

end;

writeln('</HTML>');

end.

Итак, мы научились создавать серверные модули, использующие в своей работе для получения данных с заполненных клиентом форм Web-страницы метод POST. Существует альтернативный метод передачи данных серверному скрипту — метод GET.

 

Метод GET

Данный метод также служит для передачи данных запроса серверному модулю, однако, в отличие от ранее изученного метода POST, не использует потока ввода. Вся строка запроса в методе GET передается в переменной окружения QUERY_STRING. Для доступа к ней, как и ранее, может использоваться функция GetEnvironmentVariabie. В данном методе существует ограничение на число посылаемых символов, поэтому его лучше использовать только для передачи заведомо коротких наборов данных. Кроме того, данный метод использует иной способ посылки данных от клиента к Web-серверу. Вместо передачи их в теле исходящего от клиента HTTP-запроса, содержимое формы вместе с названиями элементов добавляется к URL запрашиваемого документа. Например, если мы заменим в листинге 9.4 параметр формы action с POST на GET, то адрес документа, запрашиваемого при нажатии на кнопку Отправить данные,будет не

http:\\localhost\cgi-bin\adduser.exe,

а

http:\\localhost\cgi-bin\adduser.exe?Firstname= %Dl%E5%FO'%E3%E5%E9+%28Sergey%29&Lastname= %CF%EE%E4%EE%EB%FC%Fl%EA%E8%E9+% 28Podolsky%29&jud=0&Bl= %CE%F2%EF%FO%EO%E2%E8%F2%FC+%E4%EO%ED%ED%FB%E5.

Как видим, непосредственно к адресу Web-документа добавляется символ?, за которым следует то же закодированное содержимое формы. (Разумеется, для получения приведенного выше URL-запроса форму сначала нужно соответствующим образом заполнить.)

Воспользуемся методом GET для подачи запроса на поиск товара в базе данных магазина.

Пусть исходная страница имеет код, приведенный в листинге 9.8.

Листинг 9.8. Подача запроса на сервер

<HTML>

<FORM action="http:\\localhost\cgi-bin\search.exe" method=GET>

<Р>Введите название товара для поиска по базе данных магазина.

<INPUT type="text" name="Search"></INPUT> <INPUT'type="submit" value="OTnpaBMTb данные" name="Bl">

</FORM>

</HTML>

Для обработки данной страницы необходимо использовать серверный модуль, который декодирует содержимое запроса, осуществляет поиск по базе данных и оправляет результаты клиенту. Элементы работы с базами данных на данном этапе опустим, сосредоточившись на первой функциональной роли.

Итак, функция, приведенная в листинге 9.9, получает из переменной окружения содержимое запроса, затем извлекает слово для поиска, декодирует символы (для этого используется описанная выше, в методе POST, функция russ) и возвращает готовую строку запроса.

Листинг 9.9. Извлечение посланной методом GET строки запроса

function GetSearch:string;

var

buffer:array[0..4095] of Char;

size:integer;

s:string; begin

size:=GetEnvironmentVariable(Pchar('QUERY_STRING'), Buffer,

SizeOf(Buffer));

s:=string(buffer);

s:=copy(s, (pos('&Search=',s)7+8), ((pos('&B1=',s))-(pos('4Search=',s)+8)));

Result:=russ(s);

end;

Работа всех операторов аналогична рассмотренным выше примерам. Сначала функция GetEnvironmentvariabie заполняет массив Buffer значением переменной окружения QUERY_STRING. После этого массив передается строке s, из которой с использованием функции сору выделяется непосредственно введенное пользователем выражение. После декодировки символов функцией russ, реализованной выше, работа рассматриваемой функции заканчивается возвращением результата полученного методом GET в программу для последующей обработки.

 

Использование протокола HTTP

Протокол HTTP (HyperText Transfer Protocol, протокол передачи гипертекста) — это соглашение о формате передачи данных посредством сети Интернет. Именно используя этот протокол, браузер посылает запрос серверу о передачи определенной Web-страницы (конкретно — HTML-файла), изображения и т. д. В свою очередь, сервер отправляет клиенту данные в формате, который соответствует протоколу HTTP. Следует отличать протоколы низкого уровня типа TCP/IP, которые устанавливают правила работы для компонентов сети от рассматриваемого протокола HTTP или FTP, например, которые определяют, как должны взаимодействовать между собой программы в рамках этой сети. Протокол передачи гипертекста определяет, как должен послать запрос браузер, чтобы любой сервер, поддерживающий данный протокол, смог понять, что от него хочет клиент. То же самое касается и возврата данных. В следующей части главы будут описаны некоторые аспекты HTTP для того, чтобы вы, дорогой читатель, смогли создавать серверные модули, умеющие отправлять клиенту данные напрямую, минуя их обработку Web-сервером.

 

Типы данных

Наверное, вы уже обратили внимание, что в предыдущих примерах первой строкой в потоке вывода от сервера к клиенту была Content-Type: text/htmi. Как очевидно, в ней содержится информация о типе последующих данных. Может возникнуть вопрос, а какие данные вообще можно посылать? Ведь современная Web-среда оперирует с десятками типов объектов: графические файлы, Flash-ролики, звуковые и видеопотоки и т. д. Типы данных, которые браузер ожидает принять от сервера в ответ на свой запрос, находятся в переменной окружения НТТР_АССЕРТ и никакие другие виды информации не будут гарантированно корректно интерпретированы им.

До сих пор нас не заботили эти моменты, потому что работа шла лишь с простым HTML-кодом, и мы предположили, что, поскольку Web-браузер предназначен для просмотра HTML-страниц, проблем быть не должно. Так оно и случилось. Давайте проверим, какие типы данных был готов принять браузер, получая ответ сервера на посланные анкетные данные. Для этого в конце листинга 9.7 допишем строки, приведенные в листинге 9.10.

Листинг 9.10. Извлечение данных из переменной окружения НТТР_АССЕРТ

size:=GetEnvironmentVariable('HTTP_ACCEPT',Buffer, SizeOf(Buffer)); writeln('HTTP_ACCEPT',' = ',Buffer, '<BR>');

Нужно ввести тип данных size и Buffer, подобно тому, как мы делали это ранее. В результате мы получим, что браузер Microsoft Internet Explorer 5.0 был готов принять следующие типы данных:

image/gif, image/x-xbitraap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, */*,

а браузер Netscape Navigator— */*, что, впрочем, равносильно. Не трудно догадаться, что тип text/htmi, который мы всегда указывали, подпадает в раздел */*, поэтому этот тип принимается и корректно интерпретируется браузером.

Вернемся к вопросу о возможных типах передаваемых данных, которые может принимать клиент и передавать сервер. Существует стандарт, регламентирующий этот набор, который называется MIME (Multimedia Internet Mail Extension, мультимедийные расширения почты Интернета). В случае, когда серверный модуль пытается вывести в поток неизвестный серверу тип данных, генерируется внутренняя ошибка сервера, и сообщение об этом отсылается клиенту. Список всех типов данных, которые готов передавать Apache клиенту, находится в файле mime.types подкаталога conf, того каталога, в котором установлена программа. Если вы хотите использовать иной тип данных, то необходимо дописать в этот файл соответствующее добавляемое название. Наиболее употребительные типы данных приведены в табл. 9.2.

Таблица 9.2. Некоторые MIME-типы данных

Название MIME-типа Тип данных
application/msword Файл Microsoft Word
application/pdf Документ Acrobat Reader
application/x-javascript JavaScript-модул b
application/x-shockwave- flash Flash-ролик
audio/mpeg Звук в формате MPEG (MP3, например)
audio/x-pn-realaudio Потоковые аудиоданные в формате Realaudio
image /bmp Точечный рисунок
image/gif GIF-изображение
image /jpeg JPEG-изображение
text/html HTML-документ
text/plain Простой текст
text/rtf Документ в формате RTF
multipart /form-data Содержимое смешанного типа



Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 525; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.107 сек.