CURLOPT_READFUNCTION未使用CURLFORM_STREAM指针

时间:2013-02-09 04:31:35

标签: stream libcurl mime multipartform-data

我正在尝试使用自定义流式传输(多个二进制文件)发送多部分MIME邮件。为此,我无法使用CURLOPT_READFUNCTION回调来使用由CURLFORM_STREAM设置的指针。

据我所知,the CURLFORM_STREAM documentation在开始传输数据时会自动调用CURLOPT_READFUNCTION指针。这种情况不会发生在我身上。

这是我当前的代码示例(我一直尝试不同的配置但没有成功)。 CURLCODECHECKCURLFORMCHECK是在错误上抛出异常的宏。 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)参数的空指针。

1 个答案:

答案 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将导致空指针为传入)。