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をネゴシエートします