提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、fcgi是什么?
  • 二、cgicc是什么?
  • 三、使用
  • 总结

前言

最近在开发一个项目,使用比较老的技术fastcgi作为web后端的处理客户端提交的GET,POST等请求。因为之前曾经使用fcgi,开发进行比较顺利,但在处理客户端POST 上传文件时就不知怎么弄了,之前没有处理过。网上查了一些fcgi处理接收文件的范例,一直没有查到。最后不得不阅读了fcgi与cgicc这两个库的源码,终于搞定了。现总结一下使用fcgi对POST 上传文件的处理。

使用fastcgi技术开发使用到两个库,分别是fcgi与cgicc。


一、fcgi是什么?

fcgi是c语言现实FastCGI开发的一个工具库,非常精小与高效,使用简单。我使用的是fcgi-2.4.1版本。
fcgi主要是对http请求接收与响应的发送,每个http请求,都产生一个FCGX_Request结构体,后续的处理与响应都是以这个FCGX_Request结构为上下文进行处理。

二、cgicc是什么?

cgicc是c++语言写的一个库,在fcgi的基础上再次封装,同样是精小与高效,提供更友好的接口给用户,重点在http的各种header 与body的解析与封装,使得对http请求的处理更加简单。本人使用的cgicc版本是cgicc-3.2.16 。

三、使用

对接收文件的处理,cgicc库已经对接收的文件数据进行解析并保存在内存里,我们只需调用接口获取即可,参考如下示例。
一个简单的多程序的fastcgi程序如下:
代码如下(示例):

#define CGI_THREAD_NUM = 4
int cgi_sock = -1;//处理http请求的函数
void cgi_service(FCGX_Request *request)
{//使用cgicc对FCGX_Request再次封装//后续使用io与cgi处理请求。cgicc::FCgiIO io(*request);cgicc::Cgicc cgi(&io);std::string method = cgi.getEnvironment().getRequestMethod();std::string path = cgi.getEnvironment().getScriptName();//对POST上传文件的处理if(method == "POST" && path == "/api/uploadFile"){cgicc::file_iterator fileIter = cgi.getFile("file");if(fileIter == cgi.getFiles().end()){printf("get none file!!!\n");}std::ofstream ofs (fileIter->getFilename());fileIter->writeToStream(ofs);ofs.close();}else if(method == "POST" && path == "/api/postForm"){//其他POST表单的处理std::string postData = cgi.getEnvironment().getPostData();//以下是继续业务的处理...}else if(methid == "GET" && path == "/api/getQuery"){//其他GET查询的处理int i;std::map<std::string, std::string> value_mapfor(cgicc::const_form_iterator i = cgi.getElements().begin();i != rcb->cgi->getElements().end(); ++i) {std::string name;std::string value;name = i->getName();value = i->getValue();value_map[name] = value;}}else{}}
//线程函数,等待-处理不断循环
void *thread_cgi(void *param)
{int ret;FCGX_Request cgi_request;while(1){memset(&cgi_request, 0, sizeof(cgi_request));FCGX_InitRequest(&cgi_request, cgi_sock, 0);ret = FCGX_Accept_r(&cgi_request);if(ret == 0){cgi_service(&cgi_request);    //处理cgi request的请求。FCGX_Finish_r(&cgi_request);}else{printf("CGI accept fail\n");}}
}int main(int argc, char* argv[])
{int i;pthread_t id[CGI_THREAD_NUM];FCGX_Init();cgi_sock = FCGX_OpenSocket(":8095", 512);if(cgi_sock < 0) {printf("open FCGX socket failed\n");return -1;}for(i = 0; i < CGI_THREAD_NUM; i++) {pthread_create(&pthread_t [i], NULL, thread_cgi, (void*)i);}return 0;
}

总结

fastcgi是比较古老的web后端技术,虽然应用开发的已经不再用该技术,但对于一些c/c++底层开发人员还是喜欢用。fcgi与cgicc配合使用,可以完成绝大部分的工作。对于https的处理,我们一般是在web服务组件前加nginx反向代理即可。

【fcgi如何处理http post上传文件】相关推荐

  1. HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。(上传文件长度问题)

    HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 问题:HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容 ...

  2. python requests 上传文件_Python requests上传文件实现步骤

    工作中涉及到一个功能,需要上传附件到一个接口,接口参数如下: 使用http post提交附件 multipart/form-data 格式,url : http://test.com/flow/upl ...

  3. flask 接口上传文件_Flask干货:Flask数据交换——上传文件

    图 | 源网络文 | 5号程序员01 事情是这样的. 有一天五号程序员打算网购一盒巧克力送给自己的女朋友 想必女朋友收到礼物是这样的: 结果商家邮寄来的巧克力中夹着一张纸条: 害!你说气不气人,现在都 ...

  4. asp实现无组件上传文件原理

    一.上传网页     上传页面代码: <form   action="upload.asp"   method="post"   enctype=&quo ...

  5. 在 node 中使用 koa-multer 库上传文件详解

    本文主要介绍了上传单个文件.多个文件,文件数量大小限制.限制文件上传类型和对上传的图片进行不同大小的裁剪,阅读本篇文章需要具备一定的 node 和 koa 框架的基础知识以及 async await ...

  6. linux sftp 上传文件内容为空,求linux 下 C/c++ 实现SFTP上传文件的代码,或shell 写的如何区分上传是否成功?...

    如题求linux系统下C/C++实现SFTP上传文件的代码,最好有一定的中文注释,谢谢了. 或是, 我看FTP上传的shell写的比较简单,但是,如何能判断是否上传成功哪?? 如果想做上传的进度条的话 ...

  7. Vue 上传文件失败的解决方案

    在一个项目中开发前端的同事使用Vue开发了一个上传文件的模块,但是无论如何就是无法提交这种POST请求给后台服务, 具体的现象就是,前端界面上传文件时, Content-Type总是applicati ...

  8. smartupload 上传文件时 把页面编码改成gbk 解决乱码

    快来java1234 吧 smartupload 上传文件时,经常会发生因为把表单设置为 enctype="multipart/form-data"而出现的中文乱码问题,本人头疼好 ...

  9. 关于上传文件的跨域问题

    在进行新框架开发的过程中,需要自定义页面组件实现脱离表单的文件(图片)上传,考虑过wex5自带的attachmentsimple的自定义写法很难受,就改用了第三方插件webuploader来实现选择文 ...

最新文章

  1. Task04:青少年软件编程(Scratch)等级考试模拟卷(一级)
  2. 使用DbVisualizer连接和管理金仓数据库
  3. java对象数组覆盖_java – 如何覆盖RAML 1.0中的对象数组属性类型
  4. vue如何取消下拉框按回车自动下拉_Web自动化测试 | Select下拉框
  5. (三)线程同步工具集_2---控制并发访问资源的多个副本
  6. json java对象 简书_Java 对象的 Json 化与反 Json 化
  7. 不安装cudnn可不可以_Linux非root用户如何优雅的安装cuda和cudnn
  8. SQL基础语句(详解版)
  9. python句柄无效_subprocess.Popen 运行windows命令出现“句柄无效”报错的解决方法
  10. java实验四结果,java实验四异常处理.doc
  11. 去中心化存储项目Sia计划于2月初启动Sia基金会
  12. splice删除选中列表_JS之删除数组中的元素的方法如delete和splice
  13. GSON的用法(处理对象和JSON的相互转化)
  14. 随机数生成器与线性同余法产生随机数
  15. 《JavaScript高级程序设计》目录笔记
  16. 台湾地区HITCON队长发威夺冠,XCTF联赛西安站国际赛顺利落幕
  17. 考研前辈最后悔的事都有哪些?
  18. 解决LaTeX:!Package CJK Error:Invalid character code报错
  19. WPS文字中通过宏加快捷键实现仿word中Lorem()函数的功能
  20. Java---CountDownLatch

热门文章

  1. fine-grained和coarse-grained理解
  2. 研究者将在IEEE机器人与自动化国际会议上展示小型机器人RoboFly,利用激光无线提供动力
  3. ftp软件,最好用的ftp软件
  4. 合肥达内培训php,合肥达内PHP培训php7扩展声明与获取ini配置
  5. mathematica--求偏导
  6. 极限切割异形图形描述脚本语言:Q代码指南
  7. Jupyter Notebook 的安装与使用
  8. 币圈一级市场丨coinlist上新系列——TRIBL
  9. SecureCRT 密码解密
  10. 用友NC系统连接不到服务器,客户端连接不到服务器 _0