如何使用fastcgi C / C ++应用程序访问POST请求的主体

我使用C ++应用程序中的http://fastcgi.com/作为后端,使用nginxnetworking服务器作为前端。

从HTML表单成功发布文件,并可以看到nginx服务器端的临时文件。 但我不知道如何使用fastcgi_stdio访问多部分POST请求的主体。 这是我的HTMLforms。

<html> <head> <title>Test Server</title> <script src="http://code.jquery.com/jquery.min.js"></script> </head> <body> <form id="upload-form" method="post" target="upload_target" enctype="multipart/form-data" action="/upload"> <input name="file" id="file" size="27" type="file" /><br /> <input type="submit" name="action" value="Upload" /><br /> <iframe id="upload_target" name="upload_target" src="" style="width:100%;height:100px;border:0px solid #fff;"></iframe> </form> </body> </html> 

我的nginx conf文件:

 location /upload { # Pass altered request body to this location upload_pass @test; # Store files to this directory # The directory is hashed, subdirectories 0 1 2 3 4 5 6 7 8 9 should exist upload_store /www/test; # Allow uploaded files to be read only by user upload_store_access user:rw group:r all:r; # Set specified fields in request body upload_set_form_field $upload_field_name.name $upload_file_name; upload_set_form_field $upload_field_name.content_type "$upload_content_type"; upload_set_form_field $upload_field_name.path "$upload_tmp_path"; # Inform backend about hash and size of a file upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5"; upload_aggregate_form_field "$upload_field_name.size" "$upload_file_size"; upload_pass_form_field "^submit$|^description$"; upload_cleanup 400 404 499 500-505; } include fastcgi.conf; # Pass altered request body to a backend location @test { fastcgi_pass localhost:8080 } 

现在,如何处理/获取fastcgi c ++应用程序中的POST请求体,以及如何将其写入适当的文件在fastcgi应用程序端?

有没有更好的快速模块来实现这一目标?

谢谢。

您可以通过FCGI_stdin流访问POST正文。 例如,您可以使用FCGI_getchar一次读取一个字节, FCGI_getcharFCGI_fgetc(FCGI_stdin)的简写形式。 您可以使用FCGI_fread在单个调用中读取更大的数据块。 所有这一切,我发现看源头 。 这些来源经常提到一个叫做“H&S”的东西,这个书是C:A参考手册的作者Harbison和Steele,这些数字是指这本书的章节。

顺便说一句,“STANDARD输入/输出”就是所谓的“stdio”。 不是“工作室”。 这些函数的行为应该与没有FCGI_前缀的对应方FCGI_ 。 因此,详细信息请查看getcharfread等的手册页。

一旦在应用程序中有了字节,就可以使用普通的stdio操作或通过FCGI_fopen打开的文件将它们写入文件。 但请注意,输入流不会直接对应于上传文件的内容。 相反,MIME编码用于传输所有表单数据,包括文件。 如果要访问文件数据,则必须解析该流 。

用这个:

 char * method = getenv("REQUEST_METHOD"); if (!strcmp(method, "POST")) { int ilen = atoi(getenv("CONTENT_LENGTH")); char *bufp = malloc(ilen); fread(bufp, ilen, 1, stdin); printf("The POST data is<P>%s\n", bufp); free(bufp); }