Вы по-прежнему хотите использовать 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 завершит передачу.