2

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

据我所知,文档CURLFORM_STREAMCURLOPT_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));
        }

My::StreamReadFunction确实被调用,但除非我curl_easy_setopt()使用CURLOPT_READDATAset 调用,否则它会为第四个 (void * userdata) 参数传递一个空指针。

4

1 回答 1

1

总之,不是CURLOPT_HTTPPOST替代品。两者都必须提供并且必须首先设置CURLOPT_POSTCURLOPT_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用我的流指针正确调用 my 。

请注意,CURLOPT_POST必须在之前 CURLOPT_HTTPPOST设置流回调才能使用正确的指针(CURLOPT_POST稍后放置将导致传入空指针)。

于 2013-02-11T19:25:37.563 回答