如何在不知道输入总大小的情况下使用curl发送多部分POST

时间:2016-09-06 03:55:35

标签: http curl libcurl live-streaming alexa-voice-service

我正在开发一个涉及通过http流发送语音的项目,我目前正在使用CURL作为我的Http后端。我看到如果我需要使用"转移编码:chunked" 我需要提及总流量大小/ "内容长度:&#34 ; 。我目前正在等待流完成,我将从中了解总内容大小。哪个有效但导致严重延误。我想知道如何在不知道输入的总内容长度的情况下以块的形式上传数据。

  

curl_formadd(& formpost,& lastptr,CURLFORM_COPYNAME," audio",     CURLFORM_CONTENTTYPE,MULTI_PART_CONTENT_TYPE_AUDIO,     CURLFORM_STREAM,&(*(aBufffer)),
    CURLFORM_CONTENTSLENGTH,缓冲区大小,     CURLFORM_END);

" CURLFORM_STREAM"的文档指定必须指定" CURLFORM_CONTENTSLENGTH" 。我需要使用" CURLFORM_STREAM"因为我的缓冲区很大,我想让curl调用" CURLOPT_READFUNCTION"发布剩余数据。

2 个答案:

答案 0 :(得分:0)

查看content-length的http请求标头规范以及message body表示只要指定了POST标头,此标头对于Transfer-Encoding请求可以是可选的

如果其中一个标头存在,服务器将查找消息正文。

问题是如果消息已经完全接收,你必须找到一种方法来弄清楚服务器。

答案 1 :(得分:0)

通过设置标头告诉libcurl使用分块编码进行POST。见下面的例子。然后,您可以简单地说谎并将CURLFORM_CONTENTSLENGTH设置为某个非零值,因为libcurl无论如何都不会在其请求中传递Content-Length:

struct curl_slist *headerlist =
   curl_slist_append(NULL, "Transfer-Encoding: chunked");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);

/* pass in the created formpost data */
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

/* send the entire thing away */
curl_easy_perform(curl);