![](/img/trans.png)
[英]cpp libcurl send zip file in http post call without using multipart\form-data
[英]How do I send long PUT data in libcurl without using file pointers?
我正在尝试与Google Contact API进行交互,为了更新远程端的联系人,我需要使用PUT请求而不是POST。
由于我想要PUT的数据已经在内存中,我真的不想处理文件指针,这似乎是CURLOPT_READDATA的默认行为。 因此,我知道除此之外我还需要使用CURLOPT_READFUNCTION,但我无法理解逻辑。
以下是相关文档: http : //curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTREADFUNCTION
打印传入的变量,我看到nmemb=16372
和size=1
。 例如,如果我的数据大小为100K,那么我需要实现的逻辑是什么?
谢谢。
您仍然希望使用CURLOPT_READDATA
,但是如果使用CURLOPT_READFUNCTION
,它可以是任何用户指定的指针。 您可以创建一个简单的结构,如:
struct put_data
{
char *data;
size_t len;
};
其中data
是PUT数据, len
是长度(剩余)。
然后,将CURLOPT_READDATA
为指向该结构的初始化实例的指针。 您将在CURLOPT_READFUNCTION
中将其作为userdata
传递给它。 在该功能中,执行以下操作:
size_t curl_size = nmemb * size;
size_t to_copy = (userdata->len < curl_size) ? userdata->len : curl_size;
memcpy(ptr, userdata->data, to_copy);
userdata->len -= to_copy;
userdata->data += to_copy;
return to_copy;
这基本上计算出复制,复制,然后更新长度和指针的数量。 在to_copy
行,我们计算最小值,因为它们受剩余量和curl缓冲区大小的限制。 最后,我们返回curl要求复制的字节数。 当你在内容结束时user_data->len
(因此to_copy
)将为0.什么都不会被复制,返回0结束传输。
这是正确的方法。
要记住的另一件事是你必须设置文件大小:
curl_easy_setopt(curlHandle, CURLOPT_INFILESIZE,(curl_off_t)putData.size);
否则,您的服务器可能会抛出错误,指出未指定请求长度。
putData是put_data结构的一个实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.