0

すべて、ASP に次のコードがあります。

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div>
    <form id="Form2" Method="Post" EncType="Multipart/Form-Data" RunAt="Server">

   <%-- The File upload Html control --%>
   Choose Your File  To Upload <BR>
   <Input Name="MyFile" id="MyFile" Type="File" RunAt="Server">
   <BR>

   <%-- A button - when clicked the form is submitted and the
            Upload_Click event handler is fired... --%>
   <Input id="Submit1" Type="Submit" Value="Upload"
             RunAt="Server">

    </form> </div>
</body>
</html>

そして、クライアント側の VB.NET の次のアルゴリズム:

  1. content-type を "multipart/form-data; bound=---------------------------" + タイムスタンプに設定します
  2. "\n\r-----------------------------" + タイムスタンプ + "\n\r" と書く
  3. 「Content-Disposition: form-data; name="MyFile"; filename="12345.bmp"\r\nContent-Type: image/bitmap\r\n\r\n」と書きます
  4. 「12345.bmp」の内容を POST する

これを libCURL で C++ に変換しようとしています。

これが私がしたことです:

        wxString header = wxString::Format( "Content-Disposition: form-data;
name=\"MyFile\"; filename=\"%s\"", fileName );
        post = curl_slist_append( post, "Content-Type: multipart/form-data;
boundary=---------------------------12345" );
        post = curl_slist_append( post, header.c_str() );
        if( !post )
        {
                return;
        }
        post = curl_slist_append( post, "Content-Type: image/bitmap" );
        if( !post )
        {
                curl_slist_free_all( post );
                return;
        }
        result = curl_formadd( &first, &last, CURLFORM_COPYNAME, "name",
CURLFORM_FILE, (const char *) fileName.c_str(), CURLFORM_END );
        result = curl_formadd( &first, &last, CURLFORM_COPYNAME, "filename",
CURLFORM_COPYCONTENTS, (const char *) fileName.c_str(),
CURLFORM_CONTENTHEADER, post, CURLFORM_END );
        result = curl_formadd(&first,  &last, CURLFORM_COPYNAME, "submit",
CURLFORM_COPYCONTENTS, "send", CURLFORM_END );
        if( result )
        {
                curl_slist_free_all( post );
                curl_formfree( first );
                return;
        }
        FILE *fp = fopen( "session.log", "w+" );
        if( !fp )
        {
                curl_slist_free_all( post );
                curl_formfree( first );
                return;
        }
        curl_easy_setopt( handle, CURLOPT_VERBOSE, 1L );
        curl_easy_setopt( handle, CURLOPT_HEADER, 1L );
        curl_easy_setopt( handle, CURLOPT_STDERR, fp );
        curl_easy_setopt( handle, CURLOPT_ERRORBUFFER, errorMsg );
        curl_easy_setopt( handle, CURLOPT_URL, "http://xxx.xxx.xxx.xxx/Default.aspx" );
        curl_easy_setopt( handle, CURLOPT_HTTPPOST, first );
        error = curl_easy_perform( handle );
        if( !error )
        {
                curl_slist_free_all( post );
                curl_formfree( first );
                return;
        }
        curl_slist_free_all( post );
        curl_formfree( first );
        curl_easy_setopt( handle, CURLOPT_HTTPPOST, NULL );
        curl_easy_setopt( handle, CURLOPT_HTTPHEADER, NULL );

しかし、残念ながらそれは失敗しています。パケットがどのように送信されるかを確認するために Windows で何を使用していますか? または、誰かが私のコード遷移の問題を見つけることができますか?

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

4

1 に答える 1

1

確かではありませんが、wxString のドキュメントを読むと、

wxString header = wxString::Format( "Content-Disposition: form-data;
name=\"MyFile\"; filename=\"%s\"", fileName );

すべきではない

wxString header = wxString::Format( "Content-Disposition: form-data;
name=\"MyFile\"; filename=\"%s\"", fileName.c_str() );

お役に立てれば。

于 2012-07-26T22:16:11.370 に答える