开源C++版本CGI库CGICC⼊门⽬录
⽬录 1
1. 简介 1
2. CGICC组成 1
3. CGI输⼊处理⼦模块类结构 2
3.1. Cgicc 2
3.2. CgiEnvironment 2
3.3. HTTPCookie 2
3.4. CgiInput 3
3.5. FormFile 3
3.6. FormEntry 3
4. CGI输⼊处理⼦模块初始化流程 3
5. 编译和安装CGICC 4
6. CGICC使⽤⽰例 5
6.1. 页⾯效果 5
6.2. HTML⽂件 5
6.3. ⽂件 6
6.4. CGI⽂件 6
6.5. 运⾏效果 8
7. HTML输出⼦模块类图 10
7.1. HTTPContentHeader 13
7.2. HTMLElement::render()函数 13
8. 问题? 16
1. 简介
CGICC是⼀个C++语⾔实现的开源CGI库,采⽤LGPL授权协议,使⽤较为简单。
2. CGICC组成
CGICC由两⼤部分组成:
1) CGI输⼊处理⼦模块
2) HTML输出⼦模块
3. CGI输⼊处理⼦模块类结构
3.1. Cgicc
CGICC的⼀类,通常直接在CGI的⼊⼝函数,如main函数中定义⼀个CGICC对象,然后即可使⽤CGICC提供的各种能⼒。
3.2. CgiEnvironment
提供get系列⽅法取各环境变量的值。
3.3. HTTPCookie
提花get系列⽅法取各Cookie的值,并⽀持set新增或修改Cookie值。
3.4. CgiInput
CgiEnvironment内部类,仅供CgiEnvironment使⽤。
3.5. FormFile
提供访问HTML的Form中的被上传⽂件信息和数据接⼝。
3.6. FormEntry
server error翻译提供访问HTML的Form中的⾮被上传⽂件类的信息和数据接⼝。取URL参数值⽰例:
cgicc::form_iterator iter = Element("param_name");
if (iter != Elements().end())
{
std::string param_value = iter->getValue();
}
// 也可以这样做:
std::string param_value = cgi("param_name");
// 除此之外,FormEntry还提供了直接取指定数据类型的参数值,如:getIntegerValue、
getDoubleValue
4. CGI输⼊处理⼦模块初始化流程
初始化流程是由Cgicc构造函数触发的,⼀般可在CGI的main函数中定义⼀个Cgicc对象:
5. 编译和安装CGICC
详细编译步骤如下:
1) 将CGICC源代码包(本⽂下载的是cgicc-3.2.)上传到Linux某⽬录(本⽂将CGICC源代码包cgicc-3.2.上传到/tmp⽬录);
2) 登录Linux,并进⼊⽬录/tmp;
3) 解压CGICC源代码包cgicc-3.2.:tar xzf cgicc-3.2.;
4) 解压后,会在/tmp下产⽣⼀个⼦⽬录cgicc-3.2.16,进⼊到这个⼦⽬录;
5) 然后执⾏configure命令(本⽂指定的安装⽬录为/usr/local/cgicc-3.2.16,可以根据需要设定为其它⽬录),以⽣成Makefile编译⽂件,如果要在共享库中使⽤CGICC,请使⽤下列编译命令:
./configure --prefix=/usr/local/cgicc-3.2.16 CXXFLAGS=-fPIC LDFLAGS=-fPIC
否则,可按如下命令编译:
./configure --prefix=/usr/local/cgicc-3.2.16
在⼀些环境上,如果不带-fPIC编译静态库,使⽤静态库时,就会报链接错误。
6) 执⾏make编译:make
7) 安装CGICC库:make install
8) 为/usr/local/cgicc-3.2.16建⽴不带版本号的软链接:
ln -s /usr/local/cgicc-3.2.16 /usr/local/cgicc
⾄此,CGICC库就安装好了!
6. CGICC使⽤⽰例
6.1. 页⾯效果
6.2. HTML⽂件
页⾯效果对应的HTML⽂件内容如下(HTML中的id⼀般是给前端如js使⽤的,⽽name通常是给服务端如CGI使⽤的):<html>
<head>
<title>upload</title>
</head>
<body>
<p>upload:
<div>
<form action="/i" method="post" name="formname"
enctype="multipart/form-data">
<input type="text" id="id1" name="name1" />
<input type="text" id="id2" name="name2" />
<p>
<input type="file" id="fileid" name="filename" />
<input type="submit" value="upload" id="upid" name="upname" />
</form>
</div>
</body>
</html>
注意,上传⽂件时,Form的enctype属性值必须被设定为multipart/form-data。
6.3. ⽂件
<是⼀个被上传的⽂件,内容只有⼀⾏:0123456789。
6.4. CGI⽂件
// 如果是Exe形式的CGI,则使⽤如下语句编译:
// g++ -g -i upload.cpp -I/usr/local/cgicc/include /usr/local/cgicc/lib/libcgicc.a
// 如果是共享库(Windows平台叫动态库)形式的CGI,则使⽤如下语句编译:
// g++ -g -i upload.cpp -shared -fPIC -I/usr/local/cgicc/include /usr/local/cgicc/lib/libcgicc.a
#include <stdio.h>
#include <sstream>
#include "cgicc/Cgicc.h"
#include "cgicc/HTMLClasses.h"
#include "cgicc/HTTPHTMLHeader.h"
int main(int argc, char **argv)
{
try
{
cgicc::Cgicc cgi;
// Output the HTTP headers for an HTML document,
// and the HTML 4.0 DTD info
std::cout << cgicc::HTTPHTMLHeader()
<< cgicc::HTMLDoctype(cgicc::HTMLDoctype::eStrict)
<< std::endl;
std::cout << cgicc::html().set("lang", "en").set("dir", "ltr")
<< std::endl;
/
/ Set up the page's header and title.
std::cout << cgicc::head() << std::endl;
std::cout << cgicc::title() << "GNU cgicc v" << Version()
<< cgicc::title() << std::endl;
std::cout << cgicc::head() << std::endl;
// Start the HTML body
std::cout << cgicc::body() << std::endl;
// Print out a message
std::cout << cgicc::h1("Hello, world from GNU cgicc") << std::endl;
const cgicc::CgiEnvironment& env = Environment();
std::cout << "<p>accept: " << env. getAccept() << std::endl;
std::cout << "<p>user agent: " << UserAgent() << std::endl;
std::cout << "<p>cookie: " << std::endl;
const std::vector<cgicc::HTTPCookie>& cookies = CookieList();
for (std::vector<cgicc::HTTPCookie>::size_type i=0; i<cookies.size(); ++i)
{
const cgicc::HTTPCookie& cookie = cookies[i];
std::cout << "<br>    cookie[" << Name()
<< "] = " << Value() << std::endl;
}
std::cout << "<p>query string: " << QueryString() << std::endl;
std::cout << "<p>remote: " << RemoteAddr() << ":" << ServerPort()                  << std::endl;
std::cout << "<p>form: " << std::endl;
const std::vector<cgicc::FormEntry>& form_entries = Elements();
for (std::vector<cgicc::FormEntry>::size_type i=0; i<form_entries.size(); ++i)
{
const cgicc::FormEntry& form_entry = form_entries[i];
std::cout << "<br>    form["
<< Name() << "] = "
<< Value() << std::endl;
}
//
// 取被上传的⽂件信息
/
/
// 使⽤getFile取得指定的被上传⽂件信息
cgicc::const_file_iterator file_iter = File("file");
// 使⽤getFiles可以取得所有被上传⽂件信息
if (file_iter == Files().end())
{
std::cout << "<p>file: " << Files().size() << std::endl;
}
else
{
const cgicc::FormFile& file = *file_iter;
std::cout << "<p>file: " << std::endl;
std::cout << "<br>    name: "
<< Name() << std::endl;
std::cout << "<br>    filename: "
<< Filename() << std::endl;
std::cout << "<br>    type: "
<< DataType() << std::endl;
std::cout << "<br>    size: "
<< DataLength() << std::endl;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。