Сервер Web своими руками. Язык HTML, приложения CGI и ISAPI



Приложение FILEUPL - часть 13


йtf

*“*t*—*—_

Ђьv_Ђъv_ъ.я.__V3цЋЮ‹тѓжЂь_sd_SRД_x

‹ыѕI№

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Здесь располагаются двоичные данные принятого файла.

Мы сократили листинг, выкинув из него часть двоичных данных

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ђЗ___ffЗ___ !&Ђ>__Tt____ѕ5cї__№_

юЛЃщ   't_юЛГґ_І

. Vc&ўW°й‹

_ЊИ-

-----------------------------264872619131689

Content-Disposition: form-data; name="sel"

First Option

-----------------------------264872619131689

Content-Disposition: form-data; name="hid"

Hidden

-----------------------------264872619131689—

Как видите, формат этого файла относительно несложен. Он состоит из отдельных секций, разделенных текстовой строкой. Строка состоит из символов “-“ и числа, которое каждый раз изменяется. При посылке файла навигатор сам выбирает разделитель. При помощи функции GetMIMEBoundary ваша программа может скопировать разделитель в отдельный буфер и использовать его при поиске нужной секции в принятых данных.

Каков дальнейший алгоритм получения данных из полей формы, а также принятого файла?

Он несложен и вы сможете реализовать его самостоятельно. Сканируя секции с использованием разделителя, вы можете в каждой секции искать строку “name=<ИмяПоля>”, где ИмяПоля - это имя поля, данные из которого вам нужно получить. Для сканирования лучше не пользоваться функцией strstr, так как она рассчитана только на символьные данные, а в секциях, содержащих файлы, присутствуют двоичные данные. Найдя нужное вам поле, вы можете извлечь его содержимое и записать его в память или файл на диске.

Сделаем еще одно замечание, касающееся мультизадачного режима работы расширений ISAPI.

Так как для повышения производительности расширение ISAPI загружается в адресное пространство сервера Microsoft Information Server в единственном экземпляре, оно работает в мультизадачном режиме. Это означает, что при обращении к критичным ресурсам вы должны использовать средства синхронизации задач, описанные нами в 26 томе “Библиотеки системного программиста”.




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