C++ Programación web

¿Qué es CGI?

  • La Interfaz de Puerta de Enlace Común (CGI, por sus siglas en inglés) es un conjunto de estándares que define cómo se intercambia la información entre el servidor web y los scripts del cliente.
  • La especificación CGI actualmente es mantenida por NCSA, y NCSA define CGI de la siguiente manera:
  • La Interfaz de Puerta de Enlace Común (CGI) es un estándar de interfaz utilizado para conectar programas de puerta de enlace externos con servidores de información (como servidores HTTP).
  • La versión actual es CGI/1.1, y la versión CGI/1.2 está en desarrollo.

Navegación web

Para comprender mejor el concepto de CGI, hagamos clic en un hipervínculo, naveguemos a una página web o URL específica y veamos qué sucede.

  • Su navegador se conecta al servidor web HTTP y solicita la URL, es decir, el nombre del archivo.
  • El servidor web analizará la URL y buscará el nombre del archivo. Si encuentra el archivo solicitado, el servidor web enviará el archivo de vuelta al navegador; de lo contrario, enviará un mensaje de error indicando que ha solicitado un archivo incorrecto.
  • El navegador web obtiene la respuesta del servidor web y muestra el archivo o el mensaje de error según la respuesta recibida.

Sin embargo, en un servidor HTTP configurado de esta manera, cada vez que se solicita un archivo en el directorio, el servidor HTTP no envía el archivo, sino que lo ejecuta como programa y envía la salida generada por la ejecución de vuelta al navegador para que se muestre.

La Interfaz de Puerta de Enlace Común (CGI) es un protocolo estándar que permite que las aplicaciones (llamadas programas CGI o scripts CGI) puedan interactuar con el servidor web y con el cliente. Estos programas CGI pueden escribirse en Python, PERL, Shell, C o C++, entre otros.

Diagrama de arquitectura CGI

El siguiente diagrama muestra la arquitectura de CGI:

CGI 架构

Configuración del servidor web

Antes de realizar programación CGI, asegúrese de que su servidor web sea compatible con CGI y esté configurado para manejar programas CGI. Todos los programas CGI ejecutados por el servidor HTTP deben estar en un directorio preconfigurado. Este directorio se llama directorio CGI y, por convención, se denomina /var/www/cgi-bin. Aunque los archivos CGI son ejecutables de C++, por convención su extensión es.cgi。

De forma predeterminada, el servidor web Apache está configurado para ejecutar programas CGI en /var/www/cgi-bin. Si desea especificar otro directorio para ejecutar scripts CGI, puede modificar la siguiente sección en el archivo 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>

Aquí asumimos que el servidor web ya está configurado y funciona correctamente; puede ejecutar cualquier programa CGI, como Perl o Shell, etc.

Primer programa CGI

Observe el siguiente programa en C++:

Ejemplo

#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 - Primer programa CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Hello World! Este es mi primer programa CGI</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Compile el código anterior, nombre el archivo ejecutable cplusplus.cgi y guárdelo en el directorio /var/www/cgi-bin. Antes de ejecutar el programa CGI, utilicechmod 755 cplusplus.cgicomandos UNIX para modificar los permisos del archivo y asegurarse de que sea ejecutable. Al acceder al archivo ejecutable, verá la siguiente salida:

Hello World! Este es mi primer programa CGI

El programa C++ anterior es un programa simple que escribe su salida en el archivo STDOUT, es decir, la muestra en pantalla. Aquí, cabe destacar que la primera línea de salidaContent-type:text/html\r\n\r\nEsta línea se envía de vuelta al navegador y especifica el tipo de contenido que se mostrará en la ventana del navegador. Debe comprender los conceptos básicos de CGI para poder usar Python y escribir programas CGI más complejos. Los programas CGI en C++ pueden interactuar con cualquier otro sistema externo (como RDBMS).

Cabeceras HTTP

LíneaContent-type:text/html\r\n\r\nEs parte de las cabeceras HTTP y se envía al navegador para que comprenda mejor el contenido de la página. El formato de las cabeceras HTTP es el siguiente:

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

También hay otras cabeceras HTTP importantes que se utilizan con frecuencia en su programación CGI.

Cabecera Descripción
Content-type: Cadena MIME que define el formato del archivo devuelto. Por ejemplo, Content-type:text/html.
Expires: Date Fecha en la que la información deja de ser válida. El navegador la utiliza para determinar cuándo debe actualizarse una página. El formato de una cadena de fecha válida debe ser 01 Jan 1998 12:00:00 GMT.
Location: URL Esta URL se refiere a la URL que debe devolverse, no a la URL solicitada. Puede usarla para redirigir una solicitud a cualquier archivo.
Last-modified: Date Fecha de última modificación del recurso.
Content-length: N Longitud de los datos a devolver, en bytes. El navegador utiliza este valor para indicar el tiempo estimado de descarga de un archivo.
Set-Cookie: String MediantestringEstablecer cookie.

Variables de entorno CGI

Todos los programas CGI pueden acceder a las siguientes variables de entorno. Estas variables desempeñan un papel muy importante al escribir programas CGI.

Nombre de la variable Descripción
CONTENT_TYPE Tipo de datos del contenido. Se utiliza cuando el cliente envía contenido adicional al servidor. Por ejemplo, funciones como la subida de archivos.
CONTENT_LENGTH Longitud de la información de la consulta. Solo disponible para solicitudes POST.
HTTP_COOKIE Devuelve las cookies configuradas en forma de pares clave y valor.
HTTP_USER_AGENT Campo de cabecera de solicitud de agente de usuario que proporciona información sobre la solicitud realizada por el usuario, incluyendo el nombre del navegador, la versión y otra información adicional de la plataforma.
PATH_INFO Ruta del script CGI.
QUERY_STRING Información codificada en URL cuando se envía una solicitud mediante el método GET, incluye los parámetros después del signo de interrogación en la URL.
REMOTE_ADDR Dirección IP del host remoto que realiza la solicitud. Esto es muy útil para el registro de logs y la autenticación.
REMOTE_HOST Nombre completamente calificado del host que realiza la solicitud. Si esta información no está disponible, se puede usar REMOTE_ADDR para obtener la dirección IP.
REQUEST_METHOD Método utilizado para realizar la solicitud. Los métodos más comunes son GET y POST.
SCRIPT_FILENAME Ruta completa del script CGI.
SCRIPT_NAME Nombre del script CGI.
SERVER_NAME Nombre de host o dirección IP del servidor.
SERVER_SOFTWARE Nombre y versión del software que se ejecuta en el servidor.

El siguiente programa CGI lista todas las variables CGI.

Ejemplo

#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>Variables de entorno 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>"; // Intenta recuperar el valor de la variable de entorno char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ){ cout << value; }else{ cout << "La variable de entorno no existe."; } cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Librería CGI C++

En ejemplos reales, necesita realizar muchas operaciones mediante programas CGI. Aquí hay una librería CGI escrita específicamente para programas C++; podemos descargarla desdeftp://ftp.gnu.org/gnu/cgicc/descargar esta librería CGI e instalarla siguiendo los pasos siguientes:

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

Nota:Las librerías libcgicc.so y libcgicc.a se instalarán en el directorio /usr/lib; es necesario ejecutar el comando de copia:

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

para que los programas CGI puedan encontrar automáticamente la librería de enlace dinámico libcgicc.so.

Puede hacer clic enC++ CGI Lib Documentationpara ver la documentación relacionada de la librería.

Métodos GET y POST

Es posible que haya encontrado una situación en la que necesite pasar información desde el navegador al servidor web y, finalmente, al programa CGI. Normalmente, el navegador utiliza dos métodos para enviar esta información al servidor web: los métodos GET y POST.

Enviar información usando el método GET

El método GET envía la información de usuario codificada añadida a la petición de la página. La página y la información codificada se separan mediante el carácter ?, como se muestra a continuación:

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

El método GET es el método predeterminado para enviar información desde el navegador al servidor web. Genera una cadena larga en la barra de direcciones del navegador. Cuando envíe contraseñas u otra información sensible al servidor, no utilice el método GET. El método GET tiene una limitación de tamaño: se pueden enviar como máximo 1024 caracteres en una cadena de solicitud.

Cuando se utiliza el método GET, la información se envía mediante la cabecera HTTP QUERY_STRING, y se puede acceder a ella en un programa CGI mediante la variable de entorno QUERY_STRING.

Puede pasar información añadiendo pares clave-valor simples al final de la URL, o mediante el método GET de la etiqueta HTML <FORM>.

Ejemplo simple de URL: método GET

A continuación se muestra una URL simple que utiliza el método GET para pasar dos valores al programa cpp_get.cgi.

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

El siguiente ejemplo generacpp_get.cgiPrograma CGI para procesar la entrada proporcionada por el navegador web. Utilizando la biblioteca CGI de C++, se puede acceder fácilmente a la información pasada:

Ejemplo

#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>Uso de los métodos GET y POST</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("first_name"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Nombre:" << **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 << "Apellido:" << **fi << endl; }else{ cout << "No text entered for last name" << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Ahora, compile el programa anterior, como se muestra a continuación:

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

Genere cpp_get.cgi, colóquelo en el directorio CGI e intente acceder a él mediante el siguiente enlace:

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

Esto producirá el siguiente resultado:

名:ZARA 
姓:ALI 

Ejemplo simple de formulario: método GET

A continuación se muestra un ejemplo simple que utiliza un formulario HTML y un botón de envío para pasar dos valores. Usaremos el mismo script CGI cpp_get.cgi para procesar la entrada.

<form action="/cgi-bin/cpp_get.cgi" method="get">Nombre:<input type="text" name="first_name"> <br />Apellido:<input type="text" name="last_name" /> <input type="submit" value="Enviar" /> </form>

La siguiente es la salida real del formulario anterior. Introduzca el nombre y el apellido, y haga clic en el botón Enviar para ver el resultado.

Enviar información usando el método POST

Un método más fiable para pasar información a un programa CGI es el método POST. Este método empaqueta la información de la misma manera que el método GET, pero en lugar de pasarla como una cadena de texto después del ? en la URL, la envía como un mensaje separado. Dicho mensaje se pasa al script CGI a través de la entrada estándar.

Utilizamos también el programa cpp_get.cgi para procesar el método POST. Tomemos el mismo ejemplo, usando un formulario HTML y un botón de envío para pasar dos valores, excepto que esta vez usamos el método POST en lugar del método GET, como se muestra a continuación:

<form action="/cgi-bin/cpp_get.cgi" method="post">Nombre:<input type="text" name="first_name"><br />Apellido:<input type="text" name="last_name" /> <input type="submit" value="Enviar" /> </form>

Pasar datos de casillas de verificación a un programa CGI

Cuando se necesitan seleccionar varias opciones, utilizamos casillas de verificación.

El siguiente ejemplo de código HTML es un formulario con dos casillas de verificación:

<form action="/cgi-bin/cpp_checkbox.cgi" method="POST" target="_blank"> <input type="checkbox" name="maths" value="on" />Matemáticas<input type="checkbox" name="physics" value="on" />Física<input type="submit" value="Seleccionar materia" /> </form>

El siguiente programa en C++ generará el script cpp_checkbox.cgi, que se utiliza para procesar la entrada proporcionada por el navegador web mediante casillas de verificación.

Ejemplo

#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>Pasar datos de casillas de verificación a un programa 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; }

Pasar datos de botones de opción a un programa CGI

Cuando solo se necesita seleccionar una opción, utilizamos botones de opción.

El siguiente ejemplo de código HTML es un formulario con dos botones de opción:

<form action="/cgi-bin/cpp_radiobutton.cgi" method="post" target="_blank"> <input type="radio" name="subject" value="maths" checked="checked"/>Matemáticas<input type="radio" name="subject" value="physics" />Física<input type="submit" value="Seleccionar materia" /> </form>

El siguiente programa en C++ generará el script cpp_radiobutton.cgi, que se utiliza para procesar la entrada proporcionada por el navegador web mediante botones de opción.

Ejemplo

#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>Pasar datos de botones de opción a un programa 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; }

Pasar datos de área de texto a un programa CGI

Cuando se necesita pasar texto de varias líneas a un programa CGI, utilizamos el elemento TEXTAREA.

El siguiente ejemplo de código HTML es un formulario con un cuadro TEXTAREA:

<form action="/cgi-bin/cpp_textarea.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4">Introduzca el texto aquí...</textarea> <input type="submit" value="Enviar" /> </form>

El siguiente programa en C++ generará el script cpp_textarea.cgi, que se utiliza para procesar la entrada proporcionada por el navegador web mediante el área de texto.

Ejemplo

#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>Pasar datos de área de texto a un programa 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; }

Pasar datos de lista desplegable a un programa CGI

Cuando hay varias opciones disponibles, pero solo se puede seleccionar una o dos, utilizamos una lista desplegable.

El siguiente ejemplo de código HTML es un formulario con una lista desplegable:

<form action="/cgi-bin/cpp_dropdown.cgi" method="post" target="_blank"> <select name="dropdown"> <option value="Maths" selected>Matemáticas</option> <option value="Physics">Física</option> </select> <input type="submit" value="Enviar"/> </form>

El siguiente programa en C++ generará el script cpp_dropdown.cgi, que se utiliza para procesar la entrada proporcionada por el navegador web mediante la lista desplegable.

Ejemplo

#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>Pasar datos de lista desplegable a un programa 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; }

Uso de cookies en CGI

El protocolo HTTP es un protocolo sin estado. Sin embargo, para un sitio web comercial, es necesario mantener la información de sesión entre diferentes páginas. Por ejemplo, un usuario finaliza su registro después de completar varios pasos en diferentes páginas. Pero, ¿cómo mantener la información de sesión del usuario en todas las páginas web?

En muchos casos, el uso de cookies es el método más eficaz para recordar y rastrear información sobre las preferencias, compras, comisiones del usuario y otros datos necesarios para una mejor experiencia del visitante o para las estadísticas del sitio web.

Cómo funciona

El servidor envía algunos datos al navegador del visitante en forma de cookie. Si el navegador acepta la cookie, esta se almacena en el disco duro del visitante como un registro de texto plano. Luego, cuando el visitante accede a otra página del sitio, se recupera la cookie. Una vez encontrada la cookie, el servidor sabe qué se ha almacenado.

Una cookie es un registro de datos en texto plano con 5 campos de longitud variable:

  • Expires :La fecha de caducidad de la cookie. Si este campo se deja vacío, la cookie caduca cuando el visitante cierra el navegador.
  • Domain :El dominio del sitio web.
  • Path :La ruta del directorio o página web que establece la cookie. Si desea recuperar la cookie desde cualquier directorio o página, este campo puede dejarse vacío.
  • Secure :Si este campo contiene la palabra "secure", la cookie solo puede recuperarse a través de un servidor seguro. Si este campo se deja vacío, no existe dicha restricción.
  • Name=Value :Las cookies se establecen y se obtienen en forma de pares clave-valor.

Configuración de cookies

Enviar cookies al navegador es muy sencillo. Estas cookies se envían junto con las cabeceras HTTP, antes del campo Content-type. Supongamos que desea establecer UserID y Password como cookies; los pasos para establecer las cookies son los siguientes:

Ejemplo

#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>Cookies en CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "Establecer cookies" << endl; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

De este ejemplo aprendimos cómo establecer cookies. UsamosSet-Cookiela cabecera HTTP para establecer cookies.

Aquí, algunos atributos para establecer cookies son opcionales, como Expires, Domain y Path. Es importante destacar que las cookies se establecen antes de la línea"Content-type:text/html\r\n\r\nde envío.

Compile el programa anterior, genere setcookies.cgi e intente usar el siguiente enlace para establecer cookies. Establecerá cuatro cookies en su computadora:

/cgi-bin/setcookies.cgi

Obtener cookies

Recuperar todas las cookies establecidas es muy sencillo. Las cookies se almacenan en la variable de entorno CGI HTTP_COOKIE, y tienen la siguiente forma:

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

El siguiente ejemplo demuestra cómo obtener las cookies.

Ejemplo

#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 en CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; // Obtener la variable de entorno 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; }

Ahora, compile el programa anterior, genere getcookies.cgi e intente usar el siguiente enlace para obtener todas las cookies disponibles en su computadora:

/cgi-bin/getcookies.cgi

Esto producirá una lista que muestra las cuatro cookies establecidas en la sección anterior, así como todas las demás cookies de su computadora:

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

Ejemplo de subida de archivos

Para cargar un archivo, el formulario HTML debe establecer el atributo enctype enmultipart/form-data. La etiqueta input con tipo file creará un botón "Examinar".

<html> <body> <form enctype="multipart/form-data" action="/cgi-bin/cpp_uploadfile.cgi" method="post"> <p>Archivo:<input type="file" name="userfile" /></p> <p><input type="submit" value="Cargar" /></p> </form> </body> </html>

El resultado de este código es el siguiente formulario:

Archivo:

Nota:El ejemplo anterior ha deshabilitado deliberadamente guardar los archivos subidos en nuestro servidor. Puede probar el código anterior en su propio servidor.

El siguiente es el script utilizado para manejar la subida de archivos:cpp_uploadfile.cpp:

Ejemplo

#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>Subida de archivos en CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; // Obtener la lista de archivos que se van a subir const_file_iterator file = cgi.getFile("userfile"); if(file != cgi.getFiles().end()) { // Enviar el tipo de datos en cout cout << HTTPContentHeader(file->getDataType()); // Escribir el contenido en cout file->writeToStream(cout); } cout << "<Subida de archivo exitosa>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

El ejemplo anterior consiste encoutescribir contenido en el flujo, pero puede abrir un flujo de archivo y guardar el contenido del archivo subido en un archivo en la ubicación de destino.

Otras extensiones