![](/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.