我正在尝试使用自定义流式传输(多个二进制文件)发送多部分MIME邮件。为此,我无法使用CURLOPT_READFUNCTION
回调来使用由CURLFORM_STREAM
设置的指针。
据我所知,the CURLFORM_STREAM
documentation在开始传输数据时会自动调用CURLOPT_READFUNCTION
指针。这种情况不会发生在我身上。
这是我当前的代码示例(我一直尝试不同的配置但没有成功)。 CURLCODECHECK
和CURLFORMCHECK
是在错误上抛出异常的宏。 streams
是我自己的StreamData
结构的向量。
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));
}
我的::StreamReadFunction
会被调用,但除非我使用curl_easy_setopt()
设置调用CURLOPT_READDATA
,否则会传递第四个(void * userdata)参数的空指针。
答案 0 :(得分:1)
简而言之,CURLOPT_HTTPPOST
不是CURLOPT_POST
的替代品。必须提供两者,并且必须首先设置CURLOPT_POST
。
我将curl_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));
然后使用我的流指针正确调用::StreamReadFunction
。
请注意,{/ 1>}必须在 CURLOPT_POST
之前设置才能使流回调使用正确的指针(稍后放置CURLOPT_HTTPPOST
将导致空指针为传入)。