1

我正在开发一个涉及通过 http 流发送语音的项目,我目前正在为我的 Http 后端使用 CURL。我看到如果我需要使用"Transfer-Encoding: chunked"我需要提到总流大小/ "Content-length:"。我目前正在等待流完成,从中我将知道总内容大小。这有效,但会导致严重延迟。我想知道如何在不知道输入的总内容长度的情况下分块上传数据。

curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "audio", CURLFORM_CONTENTTYPE, MULTI_PART_CONTENT_TYPE_AUDIO, CURLFORM_STREAM, &(*(aBuffer)),
CURLFORM_CONTENTSLENGTH,bufferSize, CURLFORM_END);

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

4

2 回答 2

0

查看 http 请求标头规范的内容长度消息正文表明,POST只要Transfer-Encoding指定标头,此标头对于请求就可以是可选的。

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

问题是您必须找到一种方法来确定服务器是否已完全接收到消息。

于 2016-09-06T04:59:37.347 回答
0

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

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);
于 2016-09-12T07:05:58.727 回答