1

libcurlを使用してC/C++コードをS3にアップロードしようとしています。コールバックから生成されるバイナリデータをアップロードしています。

私はしばらくこれを見つめているので、私はかなり離れているかもしれません:(しかし、これが私のコードが今どのように見えるかです:

まず、次のようにフォームを作成します。

struct curl_httppost *buildForm(void *streamData, long contentLength) {
   struct curl_httppost *formpost=NULL;
   struct curl_httppost *lastptr=NULL;
   for( int i=0; i<form.size(); ++i ) {
     curl_formadd(&formpost,
           &lastptr,
           CURLFORM_COPYNAME, form[i].first.c_str(),
           CURLFORM_COPYCONTENTS, form[i].second.c_str(),
           CURLFORM_END);
  }
  curl_formadd(&formpost,
           &lastptr,
           CURLFORM_COPYNAME, "file",
           CURLFORM_STREAM, streamData,
           CURLFORM_CONTENTSLENGTH, (long) contentLength,
           CURLFORM_FILENAME, "chunk",
           //CURLFORM_CONTENTTYPE, "application/octet-stream",
           CURLFORM_END);
  return formpost;
}

次に、次のようにリクエストを設定します。

  curl_easy_reset( handle );
  struct curl_slist *headers = NULL;
  headers = curl_slist_append(headers, "Expect:");
  curl_easy_setopt( handle, CURLOPT_HTTPHEADER, headers);
  curl_easy_setopt( handle, CURLOPT_VERBOSE, 1L );
  curl_easy_setopt( handle, CURLOPT_DEBUGFUNCTION, curlDebugger );
  curl_easy_setopt( handle, CURLOPT_URL, postInstructions.url.c_str() );
  curl_easy_setopt( handle, CURLOPT_POST, 1L);

  // set the data and header read callbacks:
  curl_easy_setopt( handle, CURLOPT_READFUNCTION, &(UploadCallback::writeDataStatic));
  curl_easy_setopt( handle, CURLOPT_HTTPPOST, formpost);
  //I have tried with and without this line
  curl_easy_setopt( handle, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)contentLength);
  curl_easy_setopt( handle, CURLOPT_WRITEFUNCTION, &(XonamiResponse::readDataStatic));
  curl_easy_setopt( handle, CURLOPT_WRITEDATA, &response);
  curl_easy_setopt( handle, CURLOPT_HEADERFUNCTION, &(XonamiResponse::readHeaderStatic));
  curl_easy_setopt( handle, CURLOPT_WRITEHEADER, &response);

  // do it!
  int success = curl_easy_perform( handle );

しかし、カールは不平を言います:

  operation aborted by callback

contentLengthと同じバイト数を生成していますが。データが要求されている限り、バッファをゼロで埋めるようにコールバックを設定すると、S3は次のように応答します。

  The body of your POST request is not well-formed multipart/form-data.

生のフォームを見ると、最後の(閉じている)境界が欠落しているように見えます。

curl --versionによると:

curl 7.19.7(universal-apple-darwin10.0)libcurl / 7.19.7 OpenSSL / 0.9.8r zlib / 1.2.3プロトコル:tftp ftp telnet dict ldaphttpファイルhttpsftps機能:GSS-IPv6ラージファイルNTLMSSLlibzをネゴシエートします

4

1 に答える 1

1

問題は、実行時にCURL_READFUNC_ABORTではなく誤って中止を返していたコールバックにあるようです。おっと。

于 2012-09-05T20:31:39.590 に答える