13

バックエンドとしてC++アプリケーションでhttp://fastcgi.com/のライブラリを使用し、フロントエンドとしてnginxWebサーバーを使用しています。

HTMLフォームからファイルを正常に投稿し、nginxサーバー側で一時ファイルを表示できます。しかし、fastcgi_stdioを使用してマルチパートPOSTリクエストの本文にアクセスする方法を理解できません。これは私のHTMLフォームです。

<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>

私のnginxconfファイル:

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アプリ側で適切なファイルに書き込む方法はありますか?

これを達成するためのより良い高速モジュールはありますか?

ありがとうございました。

4

2 に答える 2

12

ストリームPOSTを介してボディにアクセスできます。FCGI_stdinたとえばFCGI_getchar、の短縮形である、を使用して、一度に1バイトずつ読み取ることができますFCGI_fgetc(FCGI_stdin)。を使用して、1回の呼び出しでより大きなデータチャンクを読み取ることができますFCGI_freadこのすべてを私はソースを見て見つけました。これらの情報源は、「H&S」と呼ばれるものを参照することがよくあります。これは、本C:A ReferenceManualの著者である「HarbisonandSteele」の略で、番号はその本の章とセクションを示しています。

ちなみに、「STanDard入出力」は「stdio」と呼ばれています。「スタジオ」ではありません。関数は、ほとんどの場合、FCGI_接頭辞なしの対応する関数と同じように動作する必要があります。詳細については、などのマニュアルページを参照してgetcharくださいfread

アプリケーションにバイトを入れたら、通常のstdio操作を使用するか、を介して開いたファイルを使用して、それらをファイルに書き込むことができますFCGI_fopen。ただし、入力ストリームはアップロードされたファイルのコンテンツに直接対応しないことに注意してください。代わりに、MIMEエンコーディングを使用して、ファイルを含むすべてのフォームデータを転送します。ファイルデータにアクセスする場合は、そのストリームを解析する必要があります。

于 2012-10-18T14:10:44.453 に答える
4

これを使って:

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);
}
于 2015-11-18T23:42:06.997 に答える