C++網頁程式設計



什麼是CGI?

  • 通用閘道器介面(CGI)是一套標準,定義了Web伺服器和自定義指令碼之間如何交換資訊。

  • CGI規範目前由NCSA維護,NCSA將CGI定義如下:

  • 通用閘道器介面(CGI)是外部閘道器程式與資訊伺服器(如HTTP伺服器)互動的標準。

  • 當前版本為CGI/1.1,CGI/1.2正在開發中。

網頁瀏覽

要理解CGI的概念,讓我們看看當我們點選超連結瀏覽特定網頁或URL時會發生什麼。

  • 您的瀏覽器聯絡HTTP Web伺服器並請求URL,即檔名。

  • Web伺服器將解析URL並查詢檔名。如果找到請求的檔案,則Web伺服器將該檔案傳送回瀏覽器,否則傳送錯誤訊息,指示您請求的檔案錯誤。

  • Web瀏覽器接收來自Web伺服器的響應,並根據接收到的響應顯示接收到的檔案或錯誤訊息。

但是,可以以這樣的方式設定HTTP伺服器:每當請求某個目錄中的檔案時,都不會將該檔案傳送回;相反,它將作為程式執行,並將程式產生的輸出傳送回您的瀏覽器以顯示。

通用閘道器介面(CGI)是一種標準協議,用於使應用程式(稱為CGI程式或CGI指令碼)能夠與Web伺服器和客戶端互動。這些CGI程式可以用Python、PERL、Shell、C或C++等編寫。

CGI架構圖

以下簡單程式顯示了CGI的簡單架構:

CGI Architecture

Web伺服器配置

在繼續進行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等。

第一個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的基本概念,並且可以使用Python編寫許多複雜的CGI程式。C++ CGI程式可以與任何其他外部系統(例如RDBMS)互動以交換資訊。

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

在您的CGI程式設計中,您將經常使用一些其他重要的HTTP頭。

序號 頭和描述
1

Content-type

定義返回檔案的格式的MIME字串。例如Content-type:text/html。

2

Expires: 日期

資訊變得無效的日期。瀏覽器應使用此資訊來確定何時需要重新整理頁面。有效的日期字串應採用01 Jan 1998 12:00:00 GMT格式。

3

Location: URL

應返回的URL,而不是請求的URL。您可以使用此欄位將請求重定向到任何檔案。

4

Last-modified: 日期

資源上次修改的日期。

5

Content-length: N

返回資料的長度(以位元組為單位)。瀏覽器使用此值來報告檔案的估計下載時間。

6

Set-Cookie: 字串

設定透過字串傳遞的cookie。

CGI環境變數

所有CGI程式都可以訪問以下環境變數。這些變數在編寫任何CGI程式時都起著重要作用。

序號 變數名和描述
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庫

對於實際示例,您需要透過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庫文件中檢視相關文件。

GET和POST方法

您肯定遇到過許多需要將一些資訊從瀏覽器傳遞到Web伺服器,最終傳遞到CGI程式的情況。瀏覽器最常使用兩種方法將此資訊傳遞到Web伺服器。這些方法是GET方法和POST方法。

使用GET方法傳遞資訊

GET方法傳送附加到頁面請求的編碼使用者資訊。頁面和編碼資訊由?字元分隔,如下所示:

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

GET方法是將資訊從瀏覽器傳遞到Web伺服器的預設方法,它會生成一個出現在瀏覽器Location:框中的長字串。如果要將密碼或其他敏感資訊傳遞到伺服器,請勿使用GET方法。GET方法有大小限制,您可以在請求字串中傳遞最多1024個字元。

使用GET方法時,資訊使用QUERY_STRING http頭傳遞,並且可以透過QUERY_STRING環境變數在CGI程式中訪問。

您可以透過簡單地連線鍵值對以及任何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>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 

簡單的表單示例:GET 方法

這是一個簡單的示例,它使用 HTML 表單和提交按鈕傳遞兩個值。我們將使用相同的 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 表單和提交按鈕傳遞兩個值,但這次使用 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 指令碼以處理 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;
}

將單選按鈕資料傳遞到 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 指令碼以處理 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;
}

將文字區域資料傳遞到 CGI 程式

當必須將多行文字傳遞到 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;
}

將下拉框資料傳遞到 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 指令碼以處理 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;
}

在 CGI 中使用 Cookie

HTTP 協議是一種無狀態協議。但是對於商業網站,需要在不同頁面之間維護會話資訊。例如,一個使用者註冊在完成多個頁面後結束。但是如何在所有網頁之間維護使用者會話資訊呢?

在許多情況下,使用 Cookie 是記住和跟蹤偏好、購買、佣金以及其他改善訪客體驗或網站統計資訊所需資訊的最有效方法。

工作原理

您的伺服器以 Cookie 的形式向訪客的瀏覽器傳送一些資料。瀏覽器可能會接受 Cookie。如果接受,它將作為純文字記錄儲存在訪客的硬碟驅動器上。現在,當訪客訪問您網站上的另一個頁面時,Cookie 可供檢索。檢索後,您的伺服器就會知道/記住儲存的內容。

Cookie 是 5 個可變長度欄位的純文字資料記錄 -

  • Expires - 這顯示 Cookie 將過期的日期。如果為空,則 Cookie 將在訪客退出瀏覽器時過期。

  • Domain - 這顯示您網站的域名。

  • Path - 這顯示設定 Cookie 的目錄或網頁的路徑。如果您想從任何目錄或頁面檢索 Cookie,則此路徑可以為空。

  • Secure - 如果此欄位包含單詞“secure”,則 Cookie 只能使用安全伺服器檢索。如果此欄位為空,則不存在此類限制。

  • Name = Value - Cookie 以鍵值對的形式設定和檢索。

設定 Cookie

向瀏覽器傳送 Cookie 非常容易。這些 Cookie 將與 HTTP 標頭一起傳送,位於 Content-type 欄位之前。假設您要將 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。帶有檔案型別的 input 標籤將建立一個“瀏覽”按鈕。

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

此程式碼的結果是以下表單 -

檔案

注意 - 上述示例已故意停用,以阻止人們在我們的伺服器上上傳檔案。但是,您可以使用您的伺服器嘗試上述程式碼。

以下是處理檔案上傳的指令碼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流,但您可以開啟檔案流並將上傳檔案的內容儲存在所需位置的檔案中。

希望您喜歡本教程。如果喜歡,請傳送您的反饋。

廣告