Вам необходимо установить параметры CURLOPT_READDATA
и CURLOPT_READFUNCTION
. Curl будет повторно вызывать CURLOPT_READFUNCTION
с тем, что вы передадите как CURLOPT_READDATA
в качестве аргумента, пока не вернет 0 или CURL_READFUNC_ABORT
.
По умолчанию libcurl предполагает, что ваши READFUNCTION считываются из дескриптора файла. Документация показывает следующий пример:
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
{
FILE *readhere = (FILE *)userdata;
curl_off_t nread;
/* copy as much data as possible into the 'ptr' buffer, but no more than
'size' * 'nmemb' bytes! */
size_t retcode = fread(ptr, size, nmemb, readhere);
nread = (curl_off_t)retcode;
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
" bytes from file\n", nread);
return retcode;
}
void setup(char *uploadthis)
{
FILE *file = fopen("rb", uploadthis);
CURLcode result;
/* set callback to use */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
/* pass in suitable argument to callback */
curl_easy_setopt(curl, CURLOPT_READDATA, uploadthis);
result = curl_easy_perform(curl);
}
Если вы хотите читать из буфера в памяти, вашему READFUNCTION нужно будет где-то запомнить смещение, и memcpy
разбивает каждый вызовпока он не достигнет конца буфера в памяти.