Веб-программирование на C ++
Что такое CGI?
Общий интерфейс шлюза или CGI - это набор стандартов, которые определяют, как происходит обмен информацией между веб-сервером и настраиваемым сценарием.
Спецификации CGI в настоящее время поддерживаются NCSA, и NCSA определяет CGI следующим образом:
Общий интерфейс шлюза, или CGI, является стандартом для программ внешнего шлюза для взаимодействия с информационными серверами, такими как серверы HTTP.
Текущая версия - CGI / 1.1, а CGI / 1.2 находится в стадии разработки.
Просмотр веб-страниц
Чтобы понять концепцию CGI, давайте посмотрим, что происходит, когда мы щелкаем гиперссылку для просмотра определенной веб-страницы или URL-адреса.
Ваш браузер связывается с веб-сервером HTTP и запрашивает URL, т.е. имя файла.
Веб-сервер проанализирует URL-адрес и будет искать имя файла. Если он находит запрошенный файл, веб-сервер отправляет этот файл обратно в браузер, в противном случае отправляет сообщение об ошибке, указывающее, что вы запросили неправильный файл.
Веб-браузер принимает ответ от веб-сервера и отображает полученный файл или сообщение об ошибке на основе полученного ответа.
Однако можно настроить HTTP-сервер таким образом, чтобы всякий раз, когда запрашивается файл в определенном каталоге, этот файл не отправляется обратно; вместо этого он выполняется как программа, и вывод, произведенный программой, отправляется обратно в ваш браузер для отображения.
Общий интерфейс шлюза (CGI) - это стандартный протокол, позволяющий приложениям (называемым программами CGI или сценариями CGI) взаимодействовать с веб-серверами и клиентами. Эти программы CGI могут быть написаны на Python, PERL, Shell, C или C ++ и т. Д.
Схема архитектуры CGI
Следующая простая программа показывает простую архитектуру CGI -
Конфигурация веб-сервера
Прежде чем приступить к программированию CGI, убедитесь, что ваш веб-сервер поддерживает CGI и настроен для обработки программ CGI. Все программы CGI, выполняемые HTTP-сервером, хранятся в предварительно настроенном каталоге. Этот каталог называется каталогом CGI и по соглашению называется / var / www / cgi-bin. По соглашению файлы CGI будут иметь расширение как.cgi, хотя они являются исполняемыми файлами C ++.
По умолчанию веб-сервер 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>Hello World - First CGI Program</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h2>Hello World! This is my first CGI program</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 и можете писать множество сложных программ CGI, используя Python. Программа C ++ CGI может взаимодействовать с любой другой внешней системой, такой как СУБД, для обмена информацией.
Заголовок HTTP
Линия Content-type:text/html\r\n\r\nявляется частью HTTP-заголовка, который отправляется браузеру для понимания содержимого. Весь HTTP-заголовок будет в следующей форме -
HTTP Field Name: Field Content
For Example
Content-type: text/html\r\n\r\n
Есть несколько других важных заголовков HTTP, которые вы часто будете использовать в программировании CGI.
Старший Нет | Заголовок и описание |
---|---|
1 | Content-type: Строка MIME, определяющая формат возвращаемого файла. Пример: Content-type: text / html. |
2 | Expires: Date Дата, когда информация становится недействительной. Это должно использоваться браузером, чтобы решить, когда страницу нужно обновить. Допустимая строка даты должна быть в формате 01 января 1998 12:00:00 GMT. |
3 | Location: URL URL-адрес, который должен быть возвращен вместо запрашиваемого URL-адреса. Вы можете использовать это поле для перенаправления запроса в любой файл. |
4 | Last-modified: Date Дата последней модификации ресурса. |
5 | Content-length: N Длина возвращаемых данных в байтах. Браузер использует это значение, чтобы сообщить предполагаемое время загрузки файла. |
6 | Set-Cookie: String Установите cookie, передаваемый через строку . |
Переменные среды CGI
Вся программа CGI будет иметь доступ к следующим переменным среды. Эти переменные играют важную роль при написании любой программы CGI.
Старший Нет | Имя и описание переменной |
---|---|
1 | CONTENT_TYPE Тип данных содержимого, используемый, когда клиент отправляет прикрепленный контент на сервер. Например, загрузка файла и т. Д. |
2 | CONTENT_LENGTH Длина информации о запросе, доступной только для запросов POST. |
3 | HTTP_COOKIE Возвращает установленные файлы cookie в виде пары ключ-значение. |
4 | HTTP_USER_AGENT Поле заголовка запроса User-Agent содержит информацию о пользовательском агенте, создавшем запрос. Это имя веб-браузера. |
5 | PATH_INFO Путь к сценарию CGI. |
6 | QUERY_STRING Информация в кодировке URL, отправляемая с запросом метода GET. |
7 | REMOTE_ADDR IP-адрес удаленного хоста, отправляющего запрос. Это может быть полезно для ведения журнала или для аутентификации. |
8 | REMOTE_HOST Полное имя хоста, выполняющего запрос. Если эта информация недоступна, то REMOTE_ADDR можно использовать для получения IR-адреса. |
9 | REQUEST_METHOD Метод, использованный для отправки запроса. Наиболее распространены методы GET и POST. |
10 | SCRIPT_FILENAME Полный путь к сценарию CGI. |
11 | SCRIPT_NAME Имя сценария CGI. |
12 | SERVER_NAME Имя хоста или IP-адрес сервера. |
13 | SERVER_SOFTWARE Название и версия программного обеспечения, на котором работает сервер. |
Вот небольшая программа CGI для вывода всех переменных CGI.
#include <iostream>
#include <stdlib.h>
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 Environment Variables</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>";
// attempt to retrieve value of environment variable
char *value = getenv( ENV[ i ].c_str() );
if ( value != 0 ) {
cout << value;
} else {
cout << "Environment variable does not exist.";
}
cout << "</td></tr>\n";
}
cout << "</table><\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Библиотека C ++ CGI
Для реальных примеров вам потребуется проделать много операций с помощью вашей программы CGI. Существует библиотека CGI, написанная для программы на C ++, которую вы можете загрузить с ftp://ftp.gnu.org/gnu/cgicc/ и выполнить шаги по установке библиотеки -
$tar xzf cgicc-X.X.X.tar.gz
$cd cgicc-X.X.X/
$./configure --prefix=/usr
$make
$make install
Вы можете проверить соответствующую документацию, доступную в разделе «Документация по C ++ CGI Lib .
Методы GET и POST
Вы, должно быть, сталкивались со многими ситуациями, когда вам нужно было передать некоторую информацию из вашего браузера на веб-сервер и, в конечном итоге, в вашу программу CGI. Чаще всего браузер использует два метода для передачи этой информации на веб-сервер. Это методы GET и POST.
Передача информации с использованием метода GET
Метод GET отправляет закодированную информацию о пользователе, добавленную к запросу страницы. Страница и закодированная информация разделяются знаком? характер следующим образом -
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
Метод GET - это метод по умолчанию для передачи информации из браузера на веб-сервер, и он создает длинную строку, которая появляется в поле Location: вашего браузера. Никогда не используйте метод GET, если у вас есть пароль или другая конфиденциальная информация для передачи на сервер. Метод GET имеет ограничение по размеру, и вы можете передать до 1024 символов в строке запроса.
При использовании метода GET информация передается с использованием HTTP-заголовка QUERY_STRING и будет доступна в вашей программе CGI через переменную среды QUERY_STRING.
Вы можете передавать информацию, просто объединяя пары ключ и значение вместе с любым URL-адресом, или вы можете использовать теги HTML <FORM> для передачи информации с помощью метода GET.
Пример простого URL: метод получения
Вот простой URL-адрес, который передаст два значения программе hello_get.py с помощью метода GET.
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALIНиже представлена программа для создания cpp_get.cgiПрограмма CGI для обработки ввода данных веб-браузером. Мы собираемся использовать библиотеку 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>Using GET and POST Methods</title>\n";
cout << "</head>\n";
cout << "<body>\n";
form_iterator fi = formData.getElement("first_name");
if( !fi->isEmpty() && fi != (*formData).end()) {
cout << "First name: " << **fi << endl;
} else {
cout << "No text entered for first name" << endl;
}
cout << "<br/>\n";
fi = formData.getElement("last_name");
if( !fi->isEmpty() &&fi != (*formData).end()) {
cout << "Last name: " << **fi << endl;
} else {
cout << "No text entered for last name" << 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Это приведет к следующему результату -
First name: ZARA
Last name: ALI
Простой пример FORM: метод GET
Вот простой пример, который передает два значения с помощью HTML FORM и кнопки отправки. Мы собираемся использовать тот же CGI-скрипт cpp_get.cgi для обработки этого ввода.
<form action = "/cgi-bin/cpp_get.cgi" method = "get">
First Name: <input type = "text" name = "first_name"> <br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
Вот фактический результат вышеуказанной формы. Вы вводите имя и фамилию, а затем нажимаете кнопку отправки, чтобы увидеть результат.
Передача информации с использованием метода POST
Обычно более надежным методом передачи информации программе CGI является метод POST. Это упаковывает информацию точно так же, как методы GET, но вместо того, чтобы отправлять ее в виде текстовой строки после символа? в URL-адресе он отправляет его как отдельное сообщение. Это сообщение поступает в сценарий CGI в виде стандартного ввода.
Та же программа cpp_get.cgi также будет обрабатывать метод POST. Давайте возьмем тот же пример, что и выше, который передает два значения с помощью HTML FORM и кнопки отправки, но на этот раз с помощью метода POST следующим образом:
<form action = "/cgi-bin/cpp_get.cgi" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
Вот фактический результат вышеуказанной формы. Вы вводите имя и фамилию, а затем нажимаете кнопку отправки, чтобы увидеть результат.
Передача данных флажка в программу CGI
Флажки используются, когда требуется выбрать более одного параметра.
Вот пример HTML-кода для формы с двумя флажками -
<form action = "/cgi-bin/cpp_checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on" /> Maths
<input type = "checkbox" name = "physics" value = "on" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
Результатом этого кода является следующая форма -
Ниже представлена программа на 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>Checkbox Data to CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
maths_flag = formData.queryCheckbox("maths");
if( maths_flag ) {
cout << "Maths Flag: ON " << endl;
} else {
cout << "Maths Flag: OFF " << endl;
}
cout << "<br/>\n";
physics_flag = formData.queryCheckbox("physics");
if( physics_flag ) {
cout << "Physics Flag: ON " << endl;
} else {
cout << "Physics Flag: OFF " << 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"/> Maths
<input type = "radio" name = "subject" value = "physics" /> Physics
<input type = "submit" value = "Select Subject" />
</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>Radio Button Data to CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
form_iterator fi = formData.getElement("subject");
if( !fi->isEmpty() && fi != (*formData).end()) {
cout << "Radio box selected: " << **fi << endl;
}
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Передача данных текстовой области в программу CGI
Элемент TEXTAREA используется, когда многострочный текст должен быть передан программе CGI.
Вот пример HTML-кода для формы с полем TEXTAREA -
<form action = "/cgi-bin/cpp_textarea.cgi" method = "post" target = "_blank">
<textarea name = "textcontent" cols = "40" rows = "4">
Type your text here...
</textarea>
<input type = "submit" value = "Submit" />
</form>
Результатом этого кода является следующая форма -
Ниже приведена программа на C ++, которая генерирует скрипт cpp_textarea.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>Text Area Data to CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
form_iterator fi = formData.getElement("textcontent");
if( !fi->isEmpty() && fi != (*formData).end()) {
cout << "Text Content: " << **fi << endl;
} else {
cout << "No text entered" << 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>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>
Результатом этого кода является следующая форма -
Ниже представлена программа на 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>Drop Down Box Data to CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
form_iterator fi = formData.getElement("dropdown");
if( !fi->isEmpty() && fi != (*formData).end()) {
cout << "Value Selected: " << **fi << endl;
}
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Использование файлов cookie в CGI
Протокол HTTP - это протокол без сохранения состояния. Но для коммерческого веб-сайта требуется поддерживать информацию о сеансе между разными страницами. Например, регистрация одного пользователя заканчивается после заполнения множества страниц. Но как сохранить информацию о сеансе пользователя на всех веб-страницах.
Во многих ситуациях использование файлов cookie является наиболее эффективным методом запоминания и отслеживания предпочтений, покупок, комиссионных и другой информации, необходимой для лучшего взаимодействия с посетителями или статистики сайта.
Как это работает
Ваш сервер отправляет некоторые данные в браузер посетителя в виде файла cookie. Браузер может принять файл cookie. Если это так, он сохраняется в виде простой текстовой записи на жестком диске посетителя. Теперь, когда посетитель переходит на другую страницу вашего сайта, cookie доступен для поиска. После получения ваш сервер знает / запоминает, что было сохранено.
Файлы cookie представляют собой запись данных в виде простого текста из 5 полей переменной длины:
Expires- Показывает дату истечения срока действия cookie. Если это поле пусто, срок действия cookie истечет, когда посетитель закроет браузер.
Domain - Это показывает доменное имя вашего сайта.
Path- Показывает путь к каталогу или веб-странице, в которой установлен файл cookie. Это может быть пустое поле, если вы хотите получить cookie из любого каталога или страницы.
Secure- Если это поле содержит слово «безопасный», то файл cookie может быть получен только с помощью безопасного сервера. Если это поле пустое, такое ограничение отсутствует.
Name = Value - Файлы cookie устанавливаются и извлекаются в виде пар ключ-значение.
Настройка файлов cookie
Отправить файлы cookie в браузер очень просто. Эти файлы cookie будут отправлены вместе с заголовком HTTP до того, как будет подан тип содержимого. Предполагая, что вы хотите установить UserID и Password как файлы cookie. Таким образом, настройка файлов cookie будет осуществляться следующим образом
#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.tutorialspoint.com;\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>Cookies in CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "Setting cookies" << endl;
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Из этого примера вы, должно быть, поняли, как устанавливать файлы cookie. Мы используемSet-Cookie Заголовок HTTP для установки файлов cookie.
Здесь необязательно устанавливать атрибуты файлов cookie, такие как Expires, Domain и Path. Примечательно, что файлы cookie устанавливаются перед отправкой волшебной строки"Content-type:text/html\r\n\r\n.
Скомпилируйте указанную выше программу для создания setcookies.cgi и попробуйте установить файлы cookie, используя следующую ссылку. На вашем компьютере будут установлены четыре файла cookie -
/cgi-bin/setcookies.cgi
Получение файлов cookie
Получить все установленные файлы cookie легко. Файлы cookie хранятся в переменной среды CGI HTTP_COOKIE и будут иметь следующую форму.
key1 = value1; key2 = value2; key3 = value3....
Вот пример того, как получить файлы cookie.
#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>Cookies in CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<table border = \"0\" cellspacing = \"2\">";
// get environment variables
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.tutorialspoint.com
Path /perl
Пример загрузки файла
Чтобы загрузить файл, HTML-форма должна иметь атрибут enctype, установленный на multipart/form-data. Тег ввода с типом файла создаст кнопку «Обзор».
<html>
<body>
<form enctype = "multipart/form-data" action = "/cgi-bin/cpp_uploadfile.cgi"
method = "post">
<p>File: <input type = "file" name = "userfile" /></p>
<p><input type = "submit" value = "Upload" /></p>
</form>
</body>
</html>
Результатом этого кода является следующая форма -
Note- Приведенный выше пример был отключен намеренно, чтобы люди не загружали файлы на наш сервер. Но вы можете попробовать приведенный выше код на своем сервере.
Вот сценарий 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>File Upload in CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
// get list of files to be uploaded
const_file_iterator file = cgi.getFile("userfile");
if(file != cgi.getFiles().end()) {
// send data type at cout.
cout << HTTPContentHeader(file->getDataType());
// write content at cout.
file->writeToStream(cout);
}
cout << "<File uploaded successfully>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Приведенный выше пример предназначен для записи содержимого на cout stream, но вы можете открыть свой файловый поток и сохранить содержимое загруженного файла в файл в нужном месте.
Надеюсь, вам понравился этот урок. Если да, пришлите нам свой отзыв.