C++ Web 編程

什麼是 CGI?

  • 公共網關介面(CGI),是一套標準,定義了資訊是如何在 Web 伺服器和客戶端腳本之間進行交換的。
  • CGI 規範目前是由 NCSA 維護的,NCSA 定義 CGI 如下:
  • 公共網關介面(CGI),是一種用於外部網關程式與資訊伺服器(如 HTTP 伺服器)對接的介面標準。
  • 目前的版本是 CGI/1.1,CGI/1.2 版本正在推進中。

Web 流覽

為了更好地瞭解 CGI 的概念,讓我們點擊一個超鏈接,流覽一個特定的網頁或 URL,看看會發生什麼。

  • 您的流覽器聯繫上 HTTP Web 伺服器,並請求 URL,即檔案名。
  • Web 伺服器將解析 URL,並查找檔案名。如果找到請求的檔,Web 伺服器會把檔發送回流覽器,否則發送一條錯誤消息,表明您請求了一個錯誤的檔。
  • Web 流覽器從 Web 伺服器獲取回應,並根據接收到的回應來顯示檔或錯誤消息。

然而,以這種方式搭建起來的 HTTP 伺服器,不管何時請求目錄中的某個檔,HTTP 伺服器發送回來的不是該檔,而是以程式形式執行,並把執行產生的輸出發送回流覽器顯示出來。

公共網關介面(CGI),是使得應用程式(稱為 CGI 程式或 CGI 腳本)能夠與 Web 伺服器以及客戶端進行交互的標準協議。這些 CGI 程式可以用 Python、PERL、Shell、C 或 C++ 等進行編寫。

CGI 架構圖

下圖演示了 CGI 的架構:

CGI 架構

Web 伺服器配置

在您進行 CGI 編程之前,請確保您的 Web 伺服器支持 CGI,並已配置成可以處理 CGI 程式。所有由 HTTP 伺服器執行的 CGI 程式,都必須在預配置的目錄中。該目錄稱為 CGI 目錄,按照慣例命名為 /var/www/cgi-bin。雖然 CGI 檔是 C++ 可執行檔,但是按照慣例它的擴展名是 .cgi

默認情況下,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 等。

第一個 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 - 第一個 CGI 程式</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Hello World! 這是我的第一個 CGI 程式</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

編譯上面的代碼,把可執行檔命名為 cplusplus.cgi,並把這個檔保存在 /var/www/cgi-bin 目錄中。在運行 CGI 程式之前,請使用 chmod 755 cplusplus.cgi UNIX 命令來修改檔模式,確保檔可執行。訪問可執行檔,您會看到下麵的輸出:

Hello World! 這是我的第一個 CGI 程式

上面的 C++ 程式是一個簡單的程式,把它的輸出寫在 STDOUT 檔上,即顯示在螢幕上。在這裏,值得注意一點,第一行輸出 Content-type:text/html\r\n\r\n。這一行發送回流覽器,並指定要顯示在流覽器窗口上的內容類型。您必須理解 CGI 的基本概念,這樣才能進一步使用 Python 編寫更多複雜的 CGI 程式。C++ CGI 程式可以與任何其他外部的系統(如 RDBMS)進行交互。

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: Date 資訊變成無效的日期。流覽器使用它來判斷一個頁面何時需要刷新。一個有效的日期字串的格式應為 01 Jan 1998 12:00:00 GMT。
Location: URL 這個 URL 是指應該返回的 URL,而不是請求的 URL。你可以使用它來重定向一個請求到任意的檔。
Last-modified: Date 資源的最後修改日期。
Content-length: N 要返回的數據的長度,以位元組為單位。流覽器使用這個值來表示一個檔的預計下載時間。
Set-Cookie: String 通過 string 設置 cookie。

CGI 環境變數

所有的 CGI 程式都可以訪問下列的環境變數。這些變數在編寫 CGI 程式時扮演了非常重要的角色。

變數名 描述
CONTENT_TYPE 內容的數據類型。當客戶端向伺服器發送附加內容時使用。例如,檔上傳等功能。
CONTENT_LENGTH 查詢的資訊長度。只對 POST 請求可用。
HTTP_COOKIE 以鍵 & 值對的形式返回設置的 cookies。
HTTP_USER_AGENT 用戶代理請求標頭字段,遞交用戶發起請求的有關資訊,包含了流覽器的名稱、版本和其他平臺性的附加資訊。
PATH_INFO CGI 腳本的路徑。
QUERY_STRING 通過 GET 方法發送請求時的 URL 編碼資訊,包含 URL 中問號後面的參數。
REMOTE_ADDR 發出請求的遠程主機的 IP 地址。這在日誌記錄和認證時是非常有用的。
REMOTE_HOST 發出請求的主機的完全限定名稱。如果此信息不可用,則可以用 REMOTE_ADDR 來獲取 IP 地址。
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; }

C++ CGI 庫

在真實的實例中,您需要通過 CGI 程式執行許多操作。這裏有一個專為 C++ 程式而編寫的 CGI 庫,我們可以從 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 Lib Documentation,查看相關的庫文檔。

GET 和 POST 方法

您可能有遇到過這樣的情況,當您需要從流覽器傳遞一些資訊到 Web 伺服器,最後再傳到 CGI 程式。通常流覽器會使用兩種方法把這個資訊傳到 Web 伺服器,分別是 GET 和 POST 方法。

使用 GET 方法傳遞資訊

GET 方法發送已編碼的用戶資訊追加到頁面請求中。頁面和已編碼資訊通過 ? 字元分隔開,如下所示:

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

GET 方法是默認的從流覽器向 Web 伺服器傳資訊的方法,它會在流覽器的地址欄中生成一串很長的字串。當您向伺服器傳密碼或其他一些敏感資訊時,不要使用 GET 方法。GET 方法有大小限制,在一個請求字串中最多可以傳 1024 個字元。

當使用 GET 方法時,是使用 QUERY_STRING http 頭來傳遞資訊,在 CGI 程式中可使用 QUERY_STRING 環境變數來訪問。

您可以通過在 URL 後跟上簡單連接的鍵值對,也可以通過使用 HTML <FORM> 標籤的 GET 方法來傳資訊。

簡單的 URL 實例:Get 方法

下麵是一個簡單的 URL,使用 GET 方法傳遞兩個值給 hello_get.py 程式。

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

下麵的實例生成 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>使用 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 << "No text entered for first name" << endl; } cout << "<br/>\n"; fi = formData.getElement("last_name"); if( !fi->isEmpty() &&fi != (*formData).end()) { cout << "姓:" << **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

這會產生以下結果:

名: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="提交" /> </form>

下麵是上述表單的實際輸出,請輸入名和姓,然後點擊提交按鈕查看結果。

使用 POST 方法傳遞資訊

一個更可靠的向 CGI 程式傳遞資訊的方法是 POST 方法。這種方法打包資訊的方式與 GET 方法相同,不同的是,它不是把資訊以文本字串形式放在 URL 中的 ? 之後進行傳遞,而是把它以單獨的消息形式進行傳遞。該消息是以標準輸入的形式傳給 CGI 腳本的。

我們同樣使用 cpp_get.cgi 程式來處理 POST 方法。讓我們以同樣的例子,通過使用 HTML 表單和提交按鈕來傳遞兩個值,只不過這次我們使用的不是 GET 方法,而是 POST 方法,如下所示:

<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="提交" /> </form>

向 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="選擇學科" /> </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>向 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"/> 數學 <input type="radio" name="subject" value="physics" /> 物理 <input type="submit" value="選擇學科" /> </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>向 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 程式傳遞文本區域數據

當需要向 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="提交" /> </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>向 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>數學</option> <option value="Physics">物理</option> </select> <input type="submit" value="提交"/> </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>向 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; }

在 CGI 中使用 Cookies

HTTP 協議是一種無狀態的協議。但對於一個商業網站,它需要在不同頁面間保持會話資訊。例如,一個用戶在完成多個頁面的步驟之後結束註冊。但是,如何在所有網頁中保持用戶的會話資訊。

在許多情況下,使用 cookies 是記憶和跟蹤有關用戶喜好、購買、傭金以及其他為追求更好的遊客體驗或網站統計所需資訊的最有效的方法。

它是如何工作的

伺服器以 cookie 的形式向訪客的流覽器發送一些數據。如果流覽器接受了 cookie,則 cookie 會以純文本記錄的形式存儲在訪客的硬碟上。現在,當訪客訪問網站上的另一個頁面時,會檢索 cookie。一旦找到 cookie,伺服器就知道存儲了什麼。

cookie 是一種純文本的數據記錄,帶有 5 個可變長度的字段:

  • Expires : cookie 的過期日期。如果此字段留空,cookie 會在訪客退出流覽器時過期。
  • Domain : 網站的功能變數名稱。
  • Path : 設置 cookie 的目錄或網頁的路徑。如果您想從任意的目錄或網頁檢索 cookie,此字段可以留空。
  • Secure : 如果此字段包含單詞 "secure",那麼 cookie 只能通過安全伺服器進行檢索。如果此字段留空,則不存在該限制。
  • Name=Value : cookie 以鍵值對的形式被設置和獲取。

設置 Cookies

向流覽器發送 cookies 是非常簡單的。這些 cookies 會在 Content-type 字段之前,與 HTTP 頭一起被發送。假設您想設置 UserID 和 Password 為 cookies,設置 cookies 的步驟如下所示:

實例

#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.xuhuhu.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>CGI 中的 Cookies</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "設置 cookies" << endl; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

從這個實例中,我們瞭解了如何設置 cookies。我們使用 Set-Cookie HTTP 頭來設置 cookies。

在這裏,有一些設置 cookies 的屬性是可選的,比如 Expires、Domain 和 Path。值得注意的是,cookies 是在發送行 "Content-type:text/html\r\n\r\n 之前被設置的。

編譯上面的程式,生成 setcookies.cgi,並嘗試使用下麵的鏈接設置 cookies。它會在您的電腦上設置四個 cookies:

/cgi-bin/setcookies.cgi

獲取 Cookies

檢索所有設置的 cookies 是非常簡單的。cookies 被存儲在 CGI 環境變數 HTTP_COOKIE 中,且它們的形式如下:

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

下麵的實例演示了如何獲取 cookies。

實例

#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 中的 Cookies</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,並嘗試使用下麵的鏈接獲取您的電腦上所有可用的 cookies:

/cgi-bin/getcookies.cgi

這會產生一個列表,顯示了上一節中設置的四個 cookies 以及您的電腦上所有其他的 cookies:

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

檔上傳實例

為了上傳一個檔,HTML 表單必須把 enctype 屬性設置為 multipart/form-data。帶有檔類型的 input 標籤會創建一個 "Browse" 按鈕。

<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 流中寫入內容,但您可以打開檔流,並把上傳的檔內容保存在目標位置的某個檔中。