Stream CURLOPT_READFUNCTION未使用CURLFORM_流指针

Stream CURLOPT_READFUNCTION未使用CURLFORM_流指针,stream,libcurl,mime,multipartform-data,Stream,Libcurl,Mime,Multipartform Data,我正在尝试发送一个带有自定义流的多部分MIME消息(多个二进制文件)。为此,我无法让我的CURLOPT_READFUNCTION回调使用CURLFORM_STREAM设置的指针 据我所知,当它开始传输数据时,会自动调用CURLOPT_READFUNCTION指针。这对我来说是不可能的 这是我当前的代码示例(我一直在尝试不同的配置,但没有成功)CURLCODECHECK和CURLFORMCHECK是在错误时引发异常的宏streams是我自己的StreamDatastructs的向量

我正在尝试发送一个带有自定义流的多部分MIME消息(多个二进制文件)。为此,我无法让我的
CURLOPT_READFUNCTION
回调使用
CURLFORM_STREAM
设置的指针

据我所知,当它开始传输数据时,会自动调用
CURLOPT_READFUNCTION
指针。这对我来说是不可能的

这是我当前的代码示例(我一直在尝试不同的配置,但没有成功)
CURLCODECHECK
CURLFORMCHECK
是在错误时引发异常的宏
streams
是我自己的
StreamData
structs的向量

        CURLCODECHECK(curl_easy_setopt(m_Curl, CURLOPT_HTTPPOST, 1L));
        CURLCODECHECK(curl_easy_setopt(m_Curl, CURLOPT_READFUNCTION, ::StreamReadFunction));

        for (auto iter = streams.begin(); iter != streams.end(); ++iter)
        {
            std::string const & name = iter->first;
            auto streamData = iter->second;

            CURLFORMCHECK(curl_formadd(&m_Post, &last,
                CURLFORM_COPYNAME, name.c_str(),
                CURLFORM_FILENAME, streamData->fileName.c_str(),
                CURLFORM_CONTENTTYPE, streamData->mimeType.c_str(),
                CURLFORM_STREAM, (void *) streamData.get(),
                CURLFORM_CONTENTSLENGTH, streamData->size,
                CURLFORM_END));
        }

My
::StreamReadFunction
确实会被调用,但除非我使用
CURLOPT\u READDATA
集调用
curl\u easy\u setopt()
,否则它会被传递给第四个(void*userdata)参数的空指针。

简而言之,
CURLOPT\u HTTPPOST
不能替代
CURLOPT\u POST
。两者都必须提供,并且必须先设置
CURLOPT_POST

我将我的
curl\u formadd()
调用移动到函数顶部,然后执行以下操作:

CURLCODECHECK(curl_easy_setopt(m_Curl, CURLOPT_POST, 1L));
CURLCODECHECK(curl_easy_setopt(m_Curl, CURLOPT_POSTFIELDSIZE, fieldSize));
CURLCODECHECK(curl_easy_setopt(m_Curl, CURLOPT_READFUNCTION, ::StreamReadFunction));
CURLCODECHECK(curl_easy_setopt(m_Curl, CURLOPT_HTTPPOST, m_Post));
CURLCODECHECK(curl_easy_setopt(m_Curl, CURLOPT_VERBOSE, 1L));
CURLCODECHECK(curl_easy_setopt(m_Curl, CURLOPT_HEADER, 1L));
然后用流指针正确地调用my
::StreamReadFunction

请注意,必须在
CURLOPT\u-POST
之前设置
CURLOPT\u-HTTPPOST
,流回调才能使用正确的指针(稍后放置
CURLOPT\u-POST
将导致传入空指针)