C++ Веб-программирование

Что такое CGI?

  • Common Gateway Interface (CGI) — это стандарт, который определяет, как происходит обмен информацией между веб-серверами и клиентскими сценариями.
  • Спецификация CGI в настоящее время поддерживается NCSA, которая определяет CGI следующим образом:
  • Common Gateway Interface (CGI) — это стандарт интерфейса для взаимодействия внешних шлюзовых программ с информационными серверами, такими как HTTP-серверы.
  • Текущая версия — CGI/1.1, а CGI/1.2 находится в разработке.

Просмотр веб-страниц

Чтобы лучше понять концепцию CGI, давайте щёлкнем по гиперссылке, просмотрим конкретную веб-страницу или URL и посмотрим, что произойдёт.

  • Ваш браузер связывается с веб-сервером HTTP и запрашивает URL, то есть имя файла.
  • Веб-сервер анализирует URL и ищет имя файла. Если запрошенный файл найден, веб-сервер отправляет файл обратно в браузер; в противном случае он отправляет сообщение об ошибке, указывающее, что вы запросили неправильный файл.
  • Веб-браузер получает ответ от веб-сервера и отображает файл или сообщение об ошибке на основе полученного ответа.

Однако в HTTP-сервере, построенном таким образом, при каждом запросе файла из каталога HTTP-сервер не отправляет сам файл обратно, а выполняет его как программу и отправляет вывод, полученный в результате этого выполнения, обратно в браузер для отображения.

Общий интерфейс шлюза (CGI) — это стандартный протокол, который позволяет приложениям (называемым CGI-программами или CGI-скриптами) взаимодействовать с веб-серверами и клиентами. Такие CGI-программы можно писать на Python, PERL, Shell, C или C++ и т. д.

Схема архитектуры CGI

Следующая схема демонстрирует архитектуру CGI:

CGI 架构

Настройка веб-сервера

Прежде чем приступить к программированию CGI, убедитесь, что ваш веб-сервер поддерживает CGI и настроен для обработки CGI-программ. Все CGI-программы, выполняемые HTTP-сервером, должны быть помещены в предварительно настроенный каталог. Этот каталог называется каталогом CGI и по соглашению имеет имя /var/www/cgi-bin. Хотя CGI-файлы являются исполняемыми файлами C++, по соглашению их расширение —.cgi。

По умолчанию веб-сервер Apache настроен на выполнение CGI-программ в /var/www/cgi-bin. Если вы хотите указать другой каталог для выполнения CGI-скриптов, можно изменить следующий раздел в файле httpd.conf:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>
 
<Directory "/var/www/cgi-bin">
Options All
</Directory>

Здесь мы предполагаем, что веб-сервер настроен и успешно работает, и вы можете запускать любую CGI-программу, например Perl или Shell, и т. д.

Первая CGI-программа

Пожалуйста, посмотрите на следующую программу на C++:

Пример

#include <iostream> using namespace std; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Привет, мир - Первая CGI-программа</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Привет, мир! Это моя первая CGI-программа</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Скомпилируйте приведённый выше код, назовите исполняемый файл cplusplus.cgi и сохраните этот файл в каталоге /var/www/cgi-bin. Перед запуском CGI-программы, пожалуйста, используйтеchmod 755 cplusplus.cgiИспользуйте команду UNIX, чтобы изменить режим файла и убедиться, что файл исполняемый. Откройте исполняемый файл, и вы увидите следующий вывод:

Привет, мир! Это моя первая CGI-программа

Приведённая выше программа на C++ — это простая программа, которая записывает свой вывод в файл STDOUT, то есть отображает его на экране. Здесь стоит отметить, что первая строка выводаContent-type:text/html\r\n\r\nотправляется обратно в браузер и определяет тип содержимого, которое будет отображаться в окне браузера. Вы должны понимать основные концепции CGI, чтобы в дальнейшем использовать Python для написания более сложных CGI-программ. CGI-программы на C++ могут взаимодействовать с любой другой внешней системой (например, с СУБД).

Информация HTTP-заголовка

строкаContent-type:text/html\r\n\r\nЭто часть информации HTTP-заголовка, которая отправляется в браузер, чтобы он лучше понимал содержимое страницы. Информация HTTP-заголовка имеет следующий формат:

HTTP 字段名称: 字段内容
 
例如
Content-type: text/html\r\n\r\n

Существуют также некоторые другие важные HTTP-заголовки, которые часто используются в вашем CGI-программировании.

Информация заголовка Описание
Content-type: MIME-строка, определяет формат возвращаемого файла. Например, Content-type:text/html.
Expires: Дата Дата, после которой информация становится недействительной. Браузер использует её, чтобы определить, когда страницу нужно обновить. Корректная строка даты должна иметь формат 01 Jan 1998 12:00:00 GMT.
Location: URL Этот URL указывает на URL, который должен быть возвращён, а не на запрошенный URL. Его можно использовать для перенаправления запроса на любой файл.
Last-modified: Дата Дата последнего изменения ресурса.
Content-length: N Длина возвращаемых данных в байтах. Браузер использует это значение, чтобы показать примерное время загрузки файла.
Set-Cookie: Строка С помощьюстрокиустановить cookie.

Переменные среды CGI

Все CGI-программы могут получать доступ к следующим переменным среды. Эти переменные играют очень важную роль при написании CGI-программ.

Имя переменной Описание
CONTENT_TYPE Тип данных содержимого. Используется, когда клиент отправляет дополнительное содержимое на сервер. Например, такие функции, как загрузка файлов.
CONTENT_LENGTH Длина информации запроса. Доступна только для POST-запросов.
HTTP_COOKIE Возвращает установленные cookies в виде пар ключ и значение.
HTTP_USER_AGENT Поле заголовка запроса user agent передает информацию о запросе пользователя, включая имя браузера, версию и другую дополнительную информацию, зависящую от платформы.
PATH_INFO Путь к CGI-скрипту.
QUERY_STRING URL-кодированная информация при отправке запроса методом GET, содержащая параметры после вопросительного знака в URL.
REMOTE_ADDR IP-адрес удаленного хоста, выполняющего запрос. Это очень полезно для логирования и аутентификации.
REMOTE_HOST Полное доменное имя хоста, выполняющего запрос. Если эта информация недоступна, для получения IP-адреса можно использовать REMOTE_ADDR.
REQUEST_METHOD Метод, используемый для выполнения запроса. Наиболее распространенные методы — GET и POST.
SCRIPT_FILENAME Полный путь к CGI-скрипту.
SCRIPT_NAME Имя CGI-скрипта.
SERVER_NAME Имя хоста или IP-адрес сервера.
SERVER_SOFTWARE Название и версия программного обеспечения, работающего на сервере.

Следующая CGI-программа перечисляет все переменные CGI.

Пример

#include <iostream> #include <stdlib.h> #include <string> using namespace std; const string ENV[ 24 ] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE" }; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Переменные окружения CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; for ( int i = 0; i < 24; i++ ) { cout << "<tr><td>" << ENV[ i ] << "</td><td>"; // Попытаться получить значение переменной окружения char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ){ cout << value; }else{ cout << "Переменная окружения не существует."; } cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Библиотека CGI для C++

В реальных примерах вам нужно выполнять множество операций через CGI-программу. Вот библиотека CGI, написанная специально для программ на C++, которую можно получить сftp://ftp.gnu.org/gnu/cgicc/Скачайте эту библиотеку CGI и установите библиотеку в соответствии со следующими шагами:

$ tar xzf cgicc-X.X.X.tar.gz 
$ cd cgicc-X.X.X/ 
$ ./configure --prefix=/usr 
$ make
$ make install

Примечание:Библиотеки libcgicc.so и libcgicc.a будут установлены в каталог /usr/lib; выполните команду копирования:

$ sudo cp /usr/lib/libcgicc.* /usr/lib64/

Чтобы CGI-программы могли автоматически находить динамически подключаемую библиотеку libcgicc.so.

Вы можете щёлкнутьДокументация по библиотеке C++ CGI, чтобы обратиться к соответствующей документации библиотеки.

Методы GET и POST

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

Передача информации с помощью метода GET

Метод GET добавляет закодированную пользовательскую информацию к запросу страницы. Страница и закодированная информация разделяются символом ?, как показано ниже:

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

Метод GET является методом по умолчанию для передачи информации из браузера на веб-сервер. Он создает длинную строку в адресной строке браузера. Когда вы передаете пароли или другую конфиденциальную информацию на сервер, не используйте метод GET. Метод GET имеет ограничение по размеру: максимально допускается 1024 символа в строке запроса.

При использовании метода GET информация передается с помощью HTTP-заголовка QUERY_STRING, доступ к которому в CGI-программах можно получить через переменную среды QUERY_STRING.

Вы можете передавать информацию, добавляя к URL простые объединенные пары ключ-значение, или используя метод GET тега HTML <FORM>.

Простой пример URL: метод Get

Ниже приведен простой URL, который передает два значения в программу cpp_get.cgi с использованием метода GET.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Следующий пример создаетcpp_get.cgiCGI-программа используется для обработки ввода из веб-браузера. Используя библиотеку C++ CGI, можно легко получить доступ к переданной информации:

Пример

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Использование методов GET и POST</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("first_name"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Имя:" << **fi << endl; }else{ cout << "Текст для имени не введён" << endl; } cout << "<br/>\n"; fi = formData.getElement("last_name"); if( !fi->isEmpty() &&fi != (*formData).end()) { cout << "Фамилия:" << **fi << endl; }else{ cout << "Фамилия не введена" << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Теперь скомпилируйте вышеприведённую программу следующим образом:

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

Сгенерируйте cpp_get.cgi, поместите его в каталог CGI и попробуйте получить к нему доступ по следующей ссылке:

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Это даёт следующий результат:

名:ZARA 
姓:ALI 

Простой пример формы: метод GET

Ниже приведён простой пример, который использует HTML-форму и кнопку отправки для передачи двух значений. Мы будем использовать тот же CGI-скрипт cpp_get.cgi для обработки ввода.

<form action="/cgi-bin/cpp_get.cgi" method="get">Имя:<input type="text" name="first_name"> <br />Фамилия:<input type="text" name="last_name" /> <input type="submit" value="Отправить" /> </форма>

Ниже приведён фактический вывод вышеуказанной формы. Пожалуйста, введите ваше имя и фамилию, затем нажмите кнопку отправки, чтобы увидеть результат.

Передача информации с помощью метода POST

Более надёжный метод передачи информации в CGI-программы — это метод POST. Этот метод упаковывает информацию так же, как метод GET, за исключением того, что вместо передачи информации в виде текстовой строки после ? в URL он передаёт её как отдельное сообщение. Сообщение передаётся CGI-скрипту как стандартный ввод.

Мы также используем программу cpp_get.cgi для обработки метода POST. Давайте воспользуемся тем же примером, передавая два значения с помощью HTML-формы и кнопки отправки, за исключением того, что на этот раз мы используем метод POST вместо метода GET, как показано ниже:

<form action="/cgi-bin/cpp_get.cgi" method="post">Имя:<input type="text" name="first_name"><br />Фамилия:<input type="text" name="last_name" /> <input type="submit" value="Отправить" /> </форма>

Передача данных флажков в CGI-программы

Когда нужно выбрать несколько вариантов, мы используем флажки.

Следующий пример HTML-кода — это форма с двумя флажками:

<form action="/cgi-bin/cpp_checkbox.cgi" method="POST" target="_blank"> <input type="checkbox" name="maths" value="on" />Математика<input type="checkbox" name="physics" value="on" />Физика<input type="submit" value="Выберите предмет" /> </форма>

Следующая программа на C++ создает сценарий cpp_checkbox.cgi, который обрабатывает ввод, передаваемый веб-браузером через флажки.

Пример

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; bool maths_flag, physics_flag; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Передача данных флажка в CGI-программу</title>\n"; cout << "</head>\n"; cout << "<body>\n"; maths_flag = formData.queryCheckbox("maths"); if( maths_flag ) { cout << "Флаг математики: ВКЛ " << endl; }else{ cout << "Флаг математики: ВЫКЛ " << endl; } cout << "<br/>\n"; physics_flag = formData.queryCheckbox("physics"); if( physics_flag ) { cout << "Флаг физики: ВКЛ " << endl; }else{ cout << "Флаг физики: ВЫКЛ " << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Передача данных радиокнопок в CGI-программы

Когда нужно выбрать только один вариант, мы используем радиокнопки.

Следующий пример HTML-кода представляет собой форму с двумя радиокнопками:

<form action="/cgi-bin/cpp_radiobutton.cgi" method="post" target="_blank"> <input type="radio" name="subject" value="maths" checked="checked"/>Математика<input type="radio" name="subject" value="physics" />Физика<input type="submit" value="Выберите предмет" /> </form>

Следующая программа на C++ генерирует скрипт cpp_radiobutton.cgi, который обрабатывает ввод, отправленный веб-браузером через радиокнопки.

Пример

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Передача данных радиокнопок в CGI-программу</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("subject"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Выбрана радиокнопка: " << **fi << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Передача данных из Textarea в CGI-программы

Когда многострочный текст нужно передать в CGI-программу, мы используем элемент TEXTAREA.

Следующий пример HTML-кода представляет собой форму с полем TEXTAREA:

<form action="/cgi-bin/cpp_textarea.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4">Пожалуйста, введите текст здесь...</textarea> <input type="submit" value="Отправить" /> </форма>

Следующая программа на C++ генерирует скрипт cpp_textarea.cgi, который обрабатывает входные данные, переданные веб-браузером через textarea.

Пример

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Передача данных из Textarea в CGI-программу</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("textcontent"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Текстовое содержимое: " << **fi << endl; }else{ cout << "Текст не введён" << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Передача данных выпадающего списка в CGI-программы

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

Следующий пример HTML-кода представляет собой форму с выпадающим списком:

<form action="/cgi-bin/cpp_dropdown.cgi" method="post" target="_blank"> <select name="dropdown"> <option value="Maths" selected>Математика</option> <option value="Physics">Физика</option> </select> <input type="submit" value="Отправить"/> </форма>

Следующая программа на C++ создаёт скрипт cpp_dropdown.cgi, который обрабатывает ввод, переданный веб-браузером через выпадающий список.

Пример

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Передача данных выпадающего списка в CGI-программу</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("dropdown"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Выбрано значение: " << **fi << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Использование куки в CGI

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

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

Как это работает

Сервер отправляет некоторые данные в браузер посетителя в виде куки. Если браузер принимает куки, они сохраняются на жёстком диске посетителя как запись в виде обычного текста. Теперь, когда посетитель заходит на другую страницу веб-сайта, куки извлекаются. Как только куки найдены, сервер знает, что было сохранено.

Куки — это запись данных в виде обычного текста с 5 полями переменной длины:

  • Expires :Срок действия куки. Если это поле оставить пустым, срок действия куки истечёт, когда посетитель закроет браузер.
  • Domain :Доменное имя веб-сайта.
  • Path :Путь к каталогу или странице, где устанавливается куки. Если вы хотите извлекать куки из любого каталога или страницы, это поле можно оставить пустым.
  • Secure :Если это поле содержит слово "secure", куки можно извлечь только через защищённый сервер. Если это поле оставить пустым, это ограничение не действует.
  • Name=Value :Куки устанавливаются и извлекаются в виде пар ключ-значение.

Установка куки

Отправка куки в браузер очень проста. Эти куки отправляются вместе с HTTP-заголовками, перед полем Content-type. Предположим, вы хотите установить UserID и Password в качестве куки. Шаги по установке куки следующие:

Пример

#include <iostream> using namespace std; int main () { cout << "Set-Cookie:UserID=XYZ;\r\n"; cout << "Set-Cookie:Password=XYZ123;\r\n"; cout << "Set-Cookie:Domain=www.w3cschool.cc;\r\n"; cout << "Set-Cookie:Path=/perl;\n"; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Куки в CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "Установка куки" << endl; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Из этого примера мы узнали, как устанавливать куки. Мы используемSet-CookieHTTP-заголовки для установки куки.

Здесь некоторые атрибуты для установки куки являются необязательными, такие как Expires, Domain и Path. Стоит отметить, что куки находятся в отправляемой строке"Content-type:text/html\r\n\r\nЭто было установлено ранее.

Скомпилируйте вышеприведённую программу, чтобы сгенерировать setcookies.cgi, и попробуйте использовать следующую ссылку для установки куки. Она установит четыре куки на вашем компьютере:

/cgi-bin/setcookies.cgi

Получение куки

Получение всех установленных куки очень просто. Куки хранятся в переменной окружения CGI HTTP_COOKIE, а их формат следующий:

key1=value1;key2=value2;key3=value3....

Следующий пример демонстрирует, как получить куки.

Пример

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc cgi; const_cookie_iterator cci; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Куки в CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; // Получить переменные окружения const CgiEnvironment& env = cgi.getEnvironment(); for( cci = env.getCookieList().begin(); cci != env.getCookieList().end(); ++cci ) { cout << "<tr><td>" << cci->getName() << "</td><td>"; cout << cci->getValue(); cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Теперь скомпилируйте приведённую выше программу, чтобы сгенерировать getcookies.cgi, и попробуйте использовать следующую ссылку, чтобы получить все доступные cookie-файлы на вашем компьютере:

/cgi-bin/getcookies.cgi

Это создаёт список, показывающий четыре cookie-файла, установленные в предыдущем разделе, а также все остальные cookie-файлы на вашем компьютере:

UserID XYZ 
Password XYZ123 
Domain www.w3cschool.cc 
Path /perl 

Пример загрузки файла

Чтобы загрузить файл, HTML-форма должна установить атрибут enctype в значениеmultipart/form-data. Тег input с типом file создаёт кнопку «Обзор».

<html> <body> <form enctype="multipart/form-data" action="/cgi-bin/cpp_uploadfile.cgi" method="post"> <p>Файл:<input type="file" name="userfile" /></p> <p><input type="submit" value="Загрузить" /></p> </form> </body> </html>

Результат этого кода — следующая форма:

Файл:

Примечание:В приведённом выше примере намеренно отключено сохранение загруженного файла на нашем сервере. Вы можете попробовать приведённый выше код на своём сервере.

Ниже приведён скрипт для обработки загрузки файлов.cpp_uploadfile.cpp:

Пример

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc cgi; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Загрузка файла в CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; // Получить список файлов для загрузки const_file_iterator file = cgi.getFile("userfile"); if(file != cgi.getFiles().end()) { // Отправить тип данных в cout cout << HTTPContentHeader(file->getDataType()); // Записать содержимое в cout file->writeToStream(cout); } cout << "<Файл успешно загружен>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

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

Другие расширения