Stream CURLOPT_READFUNCTION未使用CURLFORM_流指针
我正在尝试发送一个带有自定义流的多部分MIME消息(多个二进制文件)。为此,我无法让我的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的向量
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
将导致传入空指针)