C ++ Webプログラミング
CGIとは何ですか?
- CGI(Common Gateway Interface)は、情報がWebサーバーとクライアント側のスクリプトとの間で交換される方法を定義する標準です。
- 以下のようにCGIの仕様は、現在定義されてNCSA、NCSAのCGIによって維持されています:
- Common Gateway Interface(CGI)、(HTTPサーバ等)の情報サーバと外部プログラムのためのゲートウェイのドッキングインターフェース規格です。
- 現在のバージョンはCGI / 1.1、CGI / 1.2バージョン進めています。
ウェブブラウザ
より良いCGIの概念を理解するために、ハイパーリンクをクリックして特定のページまたはURLを参照し、何が起こるか見てみましょう。
- ブラウザは、すなわち、ファイル名がHTTP Webサーバー上のリンクとURLを要求します。
- Webサーバーは、URLを解決し、ファイル名を見つけます。 あなたが要求したファイルを見つけた場合は、Webサーバーは、そうしないと、間違ったファイルを要求していることを示すエラーメッセージを送信し、ブラウザにファイルを送信します。
- Webブラウザは、Webサーバからの応答を取得し、応答に基づいて、ファイルまたはエラーメッセージを表示するために受信します。
しかし、関係なく、ファイルのディレクトリを要求するときの、HTTPサーバを構築するように、HTTPサーバがファイルを送り返すのではなく、プログラムの実行および生成される出力の実施の形態のブラウザ表示に送り返されますアウト。
CGI(Common Gateway Interface)は、Webサーバーとクライアントが標準プロトコルを相互作用と連携するアプリケーション(CGIプログラムやCGIスクリプトと呼ばれる)を作ることです。 これらのCGIプログラムは、準備するなどのPython、Perl、シェル、CまたはC ++を使用することができます。
CGIチャート
次の図は、CGIのアーキテクチャを示しています。
Webサーバーの設定
あなたはCGIプログラミングを行う前に、WebサーバーがCGIをサポートしており、CGIプログラムを処理するように構成されていることを確認してください。 HTTPサーバで実行されるすべてのCGIプログラムは、ディレクトリを事前に設定する必要があります。 このディレクトリは/ var / www /のcgi-binという名前の慣例により、CGIディレクトリと呼ばれます。 CGI実行可能ファイルは、C ++ですが、しかし、慣例により、それが拡張.cgiのです。
デフォルトでは、Apache Webサーバは、CGIプログラムでは/ var / www /ののcgi-binで実行するように構成されることになります。 あなたは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やシェルなどの任意の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 - 第一个 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コマンドを使用してください、ファイルが実行可能であることを確認してください。 実行可能ファイルにアクセスするには、次の出力が表示されます。
世界こんにちは!これは私の最初のCGIプログラムであります
上記のC ++プログラムは、画面上に表示され、それが標準出力ファイルに書かれている単純なプログラムです。 ここで、注目すべきは、出力コンテンツタイプの最初の行:text / htmlの\ rをする\ nします\ r \ n。 この行は、ブラウザに送信され、ブラウザウィンドウのコンテンツタイプに表示されるように運命づけられています。 さらに、より複雑なCGIプログラムを書くためにPythonを使用するようにあなたは、CGIの基本的な概念を理解する必要があります。 C ++のCGIプログラムが対話する(RDBMSなどの)他の外部システムで使用することができます。
HTTPヘッダー情報
ラインのコンテンツタイプ: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> 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/~~V 、このCGIライブラリライブラリをダウンロードし、以下の手順に従ってインストール:
$tar xzf cgicc-X.X.X.tar.gz $cd cgicc-X.X.X/ $./configure --prefix=/usr $make $make install
あなたはをクリックするC ++ CGI Libのドキュメントを 、ライブラリのドキュメントを表示します。
GETとPOSTメソッド
あなたがWebサーバーにブラウザからいくつかの情報を渡す必要があるときに、このような状況に遭遇し、そして最終的にCGIプログラムに渡された可能性があります。 典型的には、ブラウザは、Webサーバーにこの情報を使用するには、2つの方法がGETとPOSTメソッドがされています。
情報を渡すためにGETメソッドを使用します。
ページリクエストに追加符号化されたユーザー情報を送信する方法をGET。 次のようにページと符号化された情報は、文字で区切ら?:
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
GETメソッドは、Webサーバーの情報転送にブラウザからデフォルトの方法ですが、それは文字列の長い文字列は、ブラウザのアドレスバーに生成されています。 あなたがサーバーに渡すパスワードやその他の機密情報は、GETメソッドを使用しない場合。 GETメソッドは、1024文字まで転送要求文字列で、サイズに制限されています。
あなたが使用するとGETメソッドは、アクセスにCGIプログラムにQUERY_STRING環境変数を使用して、情報を送信するためにQUERY_STRING HTTPヘッダーを使用することです。
あなたは、単純な接続のURLのキーに追いつくことができます、また情報を送信するためにHTML GETメソッド<FORM>タグを使用することができます。
簡単なURLの例:方法を取得します。
ここでは、プログラムをhello_get.pyする2つの値を渡すためにGETメソッドを使用して、簡単なURLです。
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
以下の実施例は、ウェブブラウザによって与えられた入力を処理するためcpp_get.cgi 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>使用 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フォームを使用して、ボタンが2つの値を渡し提出します。 我々は、入力を処理するために同じ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メソッドです。 このことは、URL内のテキスト文字列としてメッセージではないことを除いて、GETメソッドと同じように情報をパッケージングする方法?後渡され、その配信の形で個別のメッセージにそれを置きます。 メッセージはCGIスクリプトの形で標準入力に渡されます。
また、POSTメソッドを処理するためにcpp_get.cgiを使用しています。 次のようにのは、HTMLフォームの使用を通過し、ボタン2つの値を提出するが、今回我々は、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コード例では、2つのチェックボックスを持つフォームです。
<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 ++プログラムは、指定されたボックスを入力することで、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>向 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コード例では、2つのラジオボタンを持つフォームです。
<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 ++プログラムは、のラジオボタンを介して入力Webブラウザを処理するためにcpp_radiobutton.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>向 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 ++プログラムは、Webブラウザ、テキストエリアによって指定された入力を処理するためにcpp_textarea.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>向 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プログラムにデータを渡します
そこに利用可能な複数のオプションがありますが、1つまたは2つのオプションを選択することができたとき、私たちは、ドロップダウンボックスを使用します。
次の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 ++プログラムは、指定されたドロップダウンボックスを介して入力Webブラウザを処理するcpp_dropdown.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>向 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にクッキーを使用して、
HTTPプロトコルはステートレスなプロトコルです。 しかし、ビジネスのウェブサイトのために、それは異なるページ間でセッション情報を保持する必要があります。 例えば、複数のステップが完了した後、ユーザは、登録ページを終了します。 しかし、どのようにすべてのページにユーザーのセッション情報を維持します。
多くの場合、クッキーの使用は覚えていて、必要な情報をより良く訪問者の経験やサイトの統計情報の追求のために、ユーザの嗜好、購入、手数料およびその他の最も効果的な方法に関する情報を追跡することです。
どのように動作します
訪問者のブラウザにいくつかのデータを送信するために、クッキーの形でサーバー。 ブラウザがCookieを受け入れる場合、クッキーはお客様のハードドライブに記録されたプレーンテキストとして保存されます。 さて、クッキーをサイト上の別のページへの訪問者を取得するとき。 あなたはクッキーを見つけたら、サーバーが保存されているものを知っているだろう。
クッキーは、純粋なテキストデータレコード、5可変長フィールドです。
- 有効期限:クッキーの有効期限を。このフィールドを空白のままにすると、訪問者がブラウザを終了すると、クッキーの有効期限が切れます。
- ドメイン:サイトのドメイン名。
- パス:パスクッキーのディレクトリまたはページを設定します。あなたが任意のディレクトリまたはページからクッキーを取得したい場合は、このフィールドは空白のままにすることができます。
- セキュア:このフィールドは、単語が含まれている場合は、「安全」、そして、クッキーはセキュアなサーバーを介して取得することができます。このフィールドは、制限は存在しないこと、空白のままにした場合。
- 名前=値:キーと値のペアの形でクッキーが設定および取得することができます。
クッキーの設定
ブラウザにクッキーを送信することは非常に簡単です。 これらのクッキーは、Content-typeフィールドの前になり、HTTPヘッダーが一緒に送信されます。 次のようにクッキーのためにユーザーIDとパスワードを設定すると仮定し、設定されたクッキーの手順は次のとおりです。
#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>CGI 中的 Cookies</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "设置 cookies" << endl; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
この例から、私たちはクッキーを設定する方法を学びました。 私たちはクッキーを設定するには、Set-Cookie HTTPヘッダーを使用します。
ここでクッキーを設定するためのいくつかのプロパティがあり、このようなドメインとパス、有効期限として、任意です。 それは注目に値する、クッキーはラインで送信される「コンテンツタイプ:テキスト/ htmlの \ rを\ nは\ rを\nは前に設定されています。
setcookies.cgiを生成する上記のプログラムをコンパイルし、クッキーを設定するには次のリンクを使用してみてください。 それはあなたのコンピュータ上の4つのクッキーを設定します:
/cgi-bin/setcookies.cgi
クッキーの取得
すべての設定を取得するためのクッキーは非常に単純です。 クッキーはCGI環境変数のHTTP_COOKIEに格納され、次のように自分のフォームが格納されます。
key1=value1;key2=value2;key3=value3....
次の例では、クッキーを取得する方法を示しています。
#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を生成し、コンパイル、およびお使いのコンピュータ上で使用可能なすべてのクッキーを取得するには次のリンクを使用しよう:
/cgi-bin/getcookies.cgi
これは、セットして、コンピュータ上の他のすべての4クッキークッキーを示しているリストを生成します:
UserID XYZ Password XYZ123 Domain www.w3cschool.cc Path /perl
ファイルアップロードの例
ファイルをアップロードするには、HTMLフォームはmultipart / form-dataに設定された属性をENCTYPE必要があります。 ファイルの種類と入力タグは、「参照」ボタンを作成します。
<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に書くことですが、ファイルストリーム、およびターゲットの場所にあるファイルでアップロードされたファイルの内容を開くことができます。