【fcgi如何处理http post上传文件】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、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上传文件】相关推荐
- HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。(上传文件长度问题)
HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 问题:HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容 ...
- python requests 上传文件_Python requests上传文件实现步骤
工作中涉及到一个功能,需要上传附件到一个接口,接口参数如下: 使用http post提交附件 multipart/form-data 格式,url : http://test.com/flow/upl ...
- flask 接口上传文件_Flask干货:Flask数据交换——上传文件
图 | 源网络文 | 5号程序员01 事情是这样的. 有一天五号程序员打算网购一盒巧克力送给自己的女朋友 想必女朋友收到礼物是这样的: 结果商家邮寄来的巧克力中夹着一张纸条: 害!你说气不气人,现在都 ...
- asp实现无组件上传文件原理
一.上传网页 上传页面代码: <form action="upload.asp" method="post" enctype=&quo ...
- 在 node 中使用 koa-multer 库上传文件详解
本文主要介绍了上传单个文件.多个文件,文件数量大小限制.限制文件上传类型和对上传的图片进行不同大小的裁剪,阅读本篇文章需要具备一定的 node 和 koa 框架的基础知识以及 async await ...
- linux sftp 上传文件内容为空,求linux 下 C/c++ 实现SFTP上传文件的代码,或shell 写的如何区分上传是否成功?...
如题求linux系统下C/C++实现SFTP上传文件的代码,最好有一定的中文注释,谢谢了. 或是, 我看FTP上传的shell写的比较简单,但是,如何能判断是否上传成功哪?? 如果想做上传的进度条的话 ...
- Vue 上传文件失败的解决方案
在一个项目中开发前端的同事使用Vue开发了一个上传文件的模块,但是无论如何就是无法提交这种POST请求给后台服务, 具体的现象就是,前端界面上传文件时, Content-Type总是applicati ...
- smartupload 上传文件时 把页面编码改成gbk 解决乱码
快来java1234 吧 smartupload 上传文件时,经常会发生因为把表单设置为 enctype="multipart/form-data"而出现的中文乱码问题,本人头疼好 ...
- 关于上传文件的跨域问题
在进行新框架开发的过程中,需要自定义页面组件实现脱离表单的文件(图片)上传,考虑过wex5自带的attachmentsimple的自定义写法很难受,就改用了第三方插件webuploader来实现选择文 ...
最新文章
- Task04:青少年软件编程(Scratch)等级考试模拟卷(一级)
- 使用DbVisualizer连接和管理金仓数据库
- java对象数组覆盖_java – 如何覆盖RAML 1.0中的对象数组属性类型
- vue如何取消下拉框按回车自动下拉_Web自动化测试 | Select下拉框
- (三)线程同步工具集_2---控制并发访问资源的多个副本
- json java对象 简书_Java 对象的 Json 化与反 Json 化
- 不安装cudnn可不可以_Linux非root用户如何优雅的安装cuda和cudnn
- SQL基础语句(详解版)
- python句柄无效_subprocess.Popen 运行windows命令出现“句柄无效”报错的解决方法
- java实验四结果,java实验四异常处理.doc
- 去中心化存储项目Sia计划于2月初启动Sia基金会
- splice删除选中列表_JS之删除数组中的元素的方法如delete和splice
- GSON的用法(处理对象和JSON的相互转化)
- 随机数生成器与线性同余法产生随机数
- 《JavaScript高级程序设计》目录笔记
- 台湾地区HITCON队长发威夺冠,XCTF联赛西安站国际赛顺利落幕
- 考研前辈最后悔的事都有哪些?
- 解决LaTeX:!Package CJK Error:Invalid character code报错
- WPS文字中通过宏加快捷键实现仿word中Lorem()函数的功能
- Java---CountDownLatch