C ++ Webプログラミング
CGIとは何ですか?
Common Gateway Interface(CGI)は、Webサーバーとカスタムスクリプトの間で情報を交換する方法を定義する一連の標準です。
CGI仕様は現在NCSAによって維持されており、NCSAはCGIを次のように定義しています。
Common Gateway Interface(CGI)は、外部ゲートウェイプログラムがHTTPサーバーなどの情報サーバーとインターフェイスするための標準です。
現在のバージョンはCGI / 1.1であり、CGI /1.2は進行中です。
Webブラウジング
CGIの概念を理解するために、ハイパーリンクをクリックして特定のWebページまたはURLを参照するとどうなるかを見てみましょう。
ブラウザがHTTPWebサーバーに接続し、URLを要求します。ファイル名。
WebサーバーはURLを解析し、ファイル名を探します。要求されたファイルが見つかった場合、Webサーバーはそのファイルをブラウザーに送り返します。それ以外の場合は、間違ったファイルを要求したことを示すエラーメッセージを送信します。
WebブラウザはWebサーバーから応答を受け取り、受信したファイルまたは受信した応答に基づいてエラーメッセージを表示します。
ただし、特定のディレクトリ内のファイルが要求されたときにそのファイルが返送されないようにHTTPサーバーを設定することは可能です。代わりに、プログラムとして実行され、プログラムから生成された出力がブラウザに返送されて表示されます。
Common Gateway Interface(CGI)は、アプリケーション(CGIプログラムまたはCGIスクリプトと呼ばれる)がWebサーバーおよびクライアントと対話できるようにするための標準プロトコルです。これらのCGIプログラムは、Python、PERL、シェル、C、C ++などで記述できます。
CGIアーキテクチャ図
次の簡単なプログラムは、CGIの簡単なアーキテクチャを示しています。
Webサーバーの構成
CGIプログラミングを続行する前に、WebサーバーがCGIをサポートし、CGIプログラムを処理するように構成されていることを確認してください。HTTPサーバーによって実行されるすべてのCGIプログラムは、事前設定されたディレクトリに保存されます。このディレクトリはCGIディレクトリと呼ばれ、慣例により/ var / www / cgi-binという名前が付けられています。慣例により、CGIファイルの拡張子は次のようになります。.cgi、C ++実行可能ファイルですが。
デフォルトでは、ApacheWebサーバーは/ 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サーバーが正常に稼働しており、PerlやShellなどの他のCGIプログラムを実行できることを前提としています。
最初の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ファイル(画面)に出力を書き込んでいる単純なプログラムです。利用可能な重要で追加の機能が1つあります。それは、最初の行の印刷です。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: Date 情報が無効になる日付。これは、ページを更新する必要がある時期を決定するためにブラウザが使用する必要があります。有効な日付文字列は、1998年1月1日12:00:00GMTの形式である必要があります。 |
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 request-headerフィールドには、リクエストを発信したユーザーエージェントに関する情報が含まれています。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 LibDocumentationで入手可能な関連ドキュメントを確認できます。
GETメソッドとPOSTメソッド
ブラウザからWebサーバーに、そして最終的にはCGIプログラムに情報を渡す必要がある場合、多くの状況に遭遇したに違いありません。ほとんどの場合、ブラウザは2つの方法を使用してこの情報をWebサーバーに渡します。これらのメソッドは、GETメソッドとPOSTメソッドです。
GETメソッドを使用した情報の受け渡し
GETメソッドは、ページリクエストに追加されたエンコードされたユーザー情報を送信します。ページとエンコードされた情報は?で区切られます 次のような文字-
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
GETメソッドは、ブラウザからWebサーバーに情報を渡すためのデフォルトのメソッドであり、ブラウザのLocation:boxに表示される長い文字列を生成します。サーバーに渡すパスワードやその他の機密情報がある場合は、GETメソッドを使用しないでください。GETメソッドにはサイズ制限があり、リクエスト文字列で最大1024文字を渡すことができます。
GETメソッドを使用する場合、情報はQUERY_STRING httpヘッダーを使用して渡され、QUERY_STRING環境変数を介してCGIプログラムでアクセスできます。
キーと値のペアを任意のURLと連結するだけで情報を渡すか、HTMLの<FORM>タグを使用してGETメソッドを使用して情報を渡すことができます。
単純なURLの例:Getメソッド
これは、GETメソッドを使用してhello_get.pyプログラムに2つの値を渡す単純なURLです。
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI以下は生成するプログラムです cpp_get.cgiWebブラウザからの入力を処理する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メソッド
これは、HTMLFORMと送信ボタンを使用して2つの値を渡す簡単な例です。同じ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メソッドも処理します。上記と同じ例を見てみましょう。HTMLFORMと送信ボタンを使用して2つの値を渡しますが、今回は次のように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プログラムに渡す
チェックボックスは、複数のオプションを選択する必要がある場合に使用されます。
これは、2つのチェックボックスがあるフォームの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 ++プログラムで、チェックボックスボタンを介してWebブラウザからの入力を処理する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プログラムに渡す
ラジオボタンは、1つのオプションのみを選択する必要がある場合に使用されます。
Here is example HTML code for a form with two radio button −
<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>
The result of this code is the following form −
Below is C++ program, which will generate cpp_radiobutton.cgi script to handle input given by web browser through radio buttons.
#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
TEXTAREA element is used when multiline text has to be passed to the CGI Program.
Here is example HTML code for a form with a TEXTAREA box −
<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>
The result of this code is the following form −
Below is C++ program, which will generate cpp_textarea.cgi script to handle input given by web browser through text area.
#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
Drop down Box is used when we have many options available but only one or two will be selected.
Here is example HTML code for a form with one drop down box −
<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>
The result of this code is the following form −
Below is C++ program, which will generate cpp_dropdown.cgi script to handle input given by web browser through drop down box.
#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 protocol is a stateless protocol. But for a commercial website it is required to maintain session information among different pages. For example one user registration ends after completing many pages. But how to maintain user's session information across all the web pages.
In many situations, using cookies is the most efficient method of remembering and tracking preferences, purchases, commissions, and other information required for better visitor experience or site statistics.
How It Works
Your server sends some data to the visitor's browser in the form of a cookie. The browser may accept the cookie. If it does, it is stored as a plain text record on the visitor's hard drive. Now, when the visitor arrives at another page on your site, the cookie is available for retrieval. Once retrieved, your server knows/remembers what was stored.
Cookies are a plain text data record of 5 variable-length fields −
Expires − This shows date the cookie will expire. If this is blank, the cookie will expire when the visitor quits the browser.
Domain − This shows domain name of your site.
Path − This shows path to the directory or web page that set the cookie. This may be blank if you want to retrieve the cookie from any directory or page.
Secure − If this field contains the word "secure" then the cookie may only be retrieved with a secure server. If this field is blank, no such restriction exists.
Name = Value − Cookies are set and retrieved in the form of key and value pairs.
Setting up Cookies
It is very easy to send cookies to browser. These cookies will be sent along with HTTP Header before the Content-type filed. Assuming you want to set UserID and Password as cookies. So cookies setting will be done as follows
#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;
}
From this example, you must have understood how to set cookies. We use Set-Cookie HTTP header to set cookies.
Here, it is optional to set cookies attributes like Expires, Domain, and Path. It is notable that cookies are set before sending magic line "Content-type:text/html\r\n\r\n.
Compile above program to produce setcookies.cgi, and try to set cookies using following link. It will set four cookies at your computer −
/cgi-bin/setcookies.cgi
Retrieving Cookies
It is easy to retrieve all the set cookies. Cookies are stored in CGI environment variable HTTP_COOKIE and they will have following form.
key1 = value1; key2 = value2; key3 = value3....
Here is an example of how to retrieve 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>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;
}
Now, compile above program to produce getcookies.cgi, and try to get a list of all the cookies available at your computer −
/cgi-bin/getcookies.cgi
This will produce a list of all the four cookies set in previous section and all other cookies set in your computer −
UserID XYZ
Password XYZ123
Domain www.tutorialspoint.com
Path /perl
File Upload Example
To upload a file the HTML form must have the enctype attribute set to multipart/form-data. The input tag with the file type will create a "Browse" button.
<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>
The result of this code is the following form −
Note − Above example has been disabled intentionally to stop people uploading files on our server. But you can try above code with your server.
Here is the script cpp_uploadfile.cpp to handle file upload −
#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;
}
The above example is for writing content at cout stream but you can open your file stream and save the content of uploaded file in a file at desired location.
Hope you have enjoyed this tutorial. If yes, please send us your feedback.