Cplusplus 简明教程

C++ Web Programming

What is CGI?

  1. 通用网关接口或 CGI 是一组定义在 Web 服务器和自定义脚本之间如何交换信息的标准。

  2. CGI 规范由 NCSA 维护,NCSA 对 CGI 的定义如下 −

  3. 通用网关接口 (CGI) 是外部网关程序与诸如 HTTP 服务器等信息服务器进行交互的标准。

  4. 当前版本为 CGI/1.1,CGI/1.2 正在进行中。

Web Browsing

要理解 CGI 的概念,让我们看看当我们单击超链接来浏览特定网页或 URL 时会发生什么。

  1. 您的浏览器会联系 HTTP Web 服务器并要求 URL,即文件名。

  2. Web 服务器将解析 URL 并寻找文件名。如果它找到请求的文件,Web 服务器就会将该文件发回浏览器,否则会发送一条错误信息,表明您请求的文件有误。

  3. Web 浏览器接收来自 Web 服务器的响应,并根据收到的响应显示已接收的文件或错误信息。

然而,可以将 HTTP 服务器设置为这样一种方式:每当请求某个目录中的文件时,该文件不会被发回,而是以程序形式被执行,程序产生的输出会被发回您的浏览器显示。

通用网关接口 (CGI) 是一种标准协议,能使应用程序(称为 CGI 程序或 CGI 脚本)与 Web 服务器和客户端进行交互。这些 CGI 程序可以用 Python、PERL、Shell、C 或 C++ 等语言编写。

CGI Architecture Diagram

以下简单程序展示了 CGI 的一种简单的架构:

cgiarch

Web Server Configuration

在开始使用 CGI 编程之前,请确保您的 Web 服务器支持 CGI,并且将其配置为处理 CGI 程序。所有将由 HTTP 服务器执行的 CGI 程序都存储在一个预先配置的目录中。这个目录称为 CGI 目录,按惯例将其命名为 /var/www/cgi-bin。按惯例,CGI 文件的扩展名为 .cgi ,尽管它们是 C++ 可执行文件。

默认情况下,Apache Web 服务器被配置为在 /var/www/cgi-bin 中运行 CGI 程序。如果您想指定任何其他目录来运行您的 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>

在这里,我假设您已成功启动并运行 Web 服务器,并且您能够运行任何其他 CGI 程序,例如 Perl 或 Shell 等。

First CGI Program

考虑以下 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 命令更改了此文件的模式以使其可执行。

My First CGI program

上述 C 程序是一个简单的程序,用于在 STDOUT 文件(即屏幕)上写入其输出。这里有一个重要的额外功能:第一行打印 Content-type:text/html\r\n\r\n 。此行发回浏览器,并指定要在浏览器屏幕上显示的内容类型。现在您一定理解了 CGI 的基本概念,并且可以使用 Python 编写很多复杂的 CGI 程序。C CGI 程序可以与任何其他外部系统(如 RDBMS)交互以交换信息。

HTTP Header

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 编程中经常使用。

Sr.No

Header & Description

1

Content-type: 定义所返回文件的格式的 MIME 字符串。例如:Content-type:text/html。

2

Expires: Date 信息失效的日期。浏览器应该使用此信息来决定何时需要刷新页面。有效的日期字符串的格式应为:01 Jan 1998 12:00:00 GMT。

3

Location: URL 应返回的 URL,而不是所请求的 URL。您可以使用此字段将请求重定向到任何文件。

4

Last-modified: Date 资源上次修改的日期。

5

Content-length: N 所返回数据的字节数。浏览器使用此值来报告用于下载文件的估计时间。

6

Set-Cookie: String 通过字符串设置的 cookie。

CGI Environment Variables

所有 CGI 程序都将能够访问以下环境变量。这些变量在编写任何 CGI 程序时发挥着重要作用。

Sr.No

Variable Name & Description

1

CONTENT_TYPE 内容的数据类型,在客户端将附加内容发送到服务器时使用。例如文件上传等。

2

CONTENT_LENGTH 仅对 POST 请求可用的查询信息的长度。

3

HTTP_COOKIE 以键 & 值对的形式返回设置的 cookie。

4

HTTP_USER_AGENT User-Agent 请求标头字段包含有关发起请求的用户代理的信息。它是 Web 浏览器的名称。

5

PATH_INFO CGI 脚本的路径。

6

QUERY_STRING 随 GET 方法请求而发送的 URL 编码信息。

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 Library

对于实际示例,您需要通过 CGI 程序来完成许多操作。有一个专为 C++ 程序编写的 CGI 库,您可以从 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 Documentation 上提供的相关文档。

GET and POST Methods

您肯定遇到过许多情况,需要从浏览器向 Web 服务器传递一些信息,并最终传递给您的 CGI 程序。最常见的是浏览器使用两种方法将此信息传递到 Web 服务器。这些方法是 GET 方法和 POST 方法。

Passing Information Using GET Method

GET 方法将编码后的用户信息附加到页面请求后发送。页面和编码后的信息由 ? 字符分隔,如下所示:

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

GET 方法是将信息从浏览器传递到 Web 服务器的默认方法,它会在浏览器的“位置”框中生成一个长字符串。如果要将密码或其他敏感信息传递给服务器,切勿使用 GET 方法。GET 方法有大小限制,您可以在请求字符串中传递多达 1024 个字符。

在使用 GET 方法时,信息是通过 QUERY_STRING http 头信息传递的,可以通过 QUERY_STRING 环境变量在 CGI 程序中访问。

您可以简单地将键值对与任何 URL 连接起来传递信息,也可以使用 HTML <FORM> 标记使用 GET 方法传递信息。

Simple URL Example: Get Method

这是一个简单的 URL,将使用 GET 方法向 hello_get.py 程序传递两个值。

这是一个生成 cpp_get.cgi CGI 程序来处理 Web 浏览器提供输入的程序。我们要使用 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 目录中,然后尝试使用以下链接进行访问 −

这将生成以下结果 −

First name: ZARA
Last name: ALI

Simple FORM Example: GET Method

这是一个使用 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>

这是上述表单的实际输出。您输入名字和姓氏,然后单击提交按钮查看结果。

Passing Information Using POST Method

向 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>

这是上述表单的实际输出。您输入名字和姓氏,然后单击提交按钮查看结果。

Passing Checkbox Data to CGI Program

如果要求选择多个选项,则使用复选框。

这是一个包含两个复选框的表单的示例 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 脚本来处理通过复选框按钮从 Web 浏览器提供的输入。

#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;
}

Passing Radio Button Data to CGI Program

如果要求只选择一个选项,则使用单选按钮。

这是一个带有两个单选按钮的表单的示例 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 脚本来处理通过单选按钮从 Web 浏览器提供的输入。

#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;
}

Passing Text Area Data to CGI Program

如果必须将多行文本传递给 CGI 程序,则使用 TEXTAREA 元素。

这是一个包含一个 TEXTAREA 框的表单的示例 HTML 代码−

<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 脚本来处理通过文本区域从 Web 浏览器提供的输入。

#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;
}

Passing Drop down Box Data to CGI Program

当我们有很多选项可用但只选择一个或两个选项时,会使用下拉框。

这是一个包含一个下拉框的表单的示例 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 脚本来处理通过下拉框从 Web 浏览器提供的输入。

#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;
}

Using Cookies in CGI

HTTP 协议是一种无状态协议。但是,对于商业网站,需要在不同页面之间维护会话信息。例如,用户注册在完成多个页面后结束。但是,如何在所有 Web 页面中维护用户的会话信息。

在许多情况下,使用 cookie 是记忆和跟踪偏好、购买、佣金和其他信息最有效的方法,而这些信息对于提升访问者体验或网站统计至关重要。

How It Works

您的服务器会以 Cookie 的形式向访客的浏览器发送一些数据。浏览器可能会接受 Cookie。如果接受,它将作为纯文本记录存储在访客硬盘上。现在,当访客到达您站点上的另一个页面时,可以检索 Cookie。检索后,您的服务器知道/记住存储的内容。

Cookie 是纯文本数据记录,包含 5 个可变长度字段:

  1. Expires − 这显示了 cookie 将过期的日期。如果这是空白,那么当访问者退出浏览器时 cookie 将过期。

  2. Domain − 这显示您网站的域名。

  3. Path - 这显示了设置 cookie 的目录或网页路径。如果要从任何目录或页面检索 cookie,则可以将其保留为空。

  4. Secure - 如果此字段包含单词“secure”,则只能通过安全服务器来检索 cookie。如果此字段为空,则不存在此类限制。

  5. Name = Value − Cookie 以键值对的形式设置和检索。

Setting up Cookies

将 cookie 发送到浏览器非常容易。这些 cookie 将在 Content-type 字段之前随 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 -

Retrieving Cookies

可以轻松检索所有设置的 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 的列表 -

这会生成之前部分中设置的所有四个 cookie,以及电脑中设置的所有其他 cookie 的列表 -

UserID XYZ
Password XYZ123
Domain www.tutorialspoint.com
Path /perl

File Upload Example

要上传文件,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 流中的内容,但是你可以打开文件流并将已上传文件的内容保存在所需位置的文件中。

希望你享受本教程。如果是,请将你的反馈发送给我们。