场景:公司需要使用cgi实现文件上传,上传结果的信息直接显示到web面。
其中涉及文件上传和保存的代码有:
//保存文件上传文件到/tmp/test.tar.gz
std::ofstream ofs("/tmp/test.tar.gz");
if(!ofs.is_open()){
response(-1,"Failed to open the template file.");
}
// 获取要被上传的文件列表
const_file_iterator file = cgi.getFile("userfile");
if(file != cgi.getFiles().end()) {
// 在 cout 中发送数据类型
cout << HTTPContentHeader(file->getDataType());
// 在 cout 中写入内容
file->writeToStream(ofs);
}
ofs.close();
cout<<"Result:Success."<<endl;
使用上面代码上传文件后,"Result:Success"的信息无法显示到页面上,而是保存到一个文件中:如下图
upgrade.cgi文件的内容如下:
遇到这样子的问题,一直百度,google都没有类似的解决方案。
没有先例,只好自己一行一行代码注释,然后编译测试。
直到把 cout << HTTPContentHeader(file->getDataType()); 注释掉,"Result:Success"的信息才显示到web页面。
原来,在cgi中打开了文件流时,就不能使用标准输出流(cout)输出信息到页面,如果要使用标准输出流输出信息到页面,必须先关闭打开的文件流,否则使用cout输出的信息,都会重定向到与cgi可执行性文件同名的文件中。如:上图的upgrade.cgi为上传文件的可执行文件。