Взгляните на следующий кодзагрузки файлов с Libcurl
static size_t reader(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t retcode = fread(ptr, size, nmemb, stream);
cout << "*** We read " << retcode << " bytes from file" << endl;
return retcode;
}
void upload() { //upload() is called from ouside
FILE *pFile;
pFile = fopen("map.txt" , "r");
struct stat file_info;
stat("map.txt", &file_info);
size_t size = (size_t)file_info.st_size;
uploadFile(pFile, size);
}
bool uploadFile(void* data, size_t datasize) {
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl) {
char *post_params = ...;
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_params);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) strlen(post_params));
curl_easy_setopt(curl, CURLOPT_READFUNCTION, reader);
curl_easy_setopt(curl, CURLOPT_READDATA, data);
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t) datasize);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return true;
}
Когда код выполняется, следующее outputed
*** We read 490 bytes from file
*** We read 0 bytes from file
после этого приложение не делает ничего (даже не выходя).
Может кто-нибудь указать, что здесь не так?
Будем благодарны за любую помощь !!!
Вы можете проверить возвращаемое значение из 'stat()', чтобы убедиться, что оно выполнено успешно, и 'file_info.st_size' верен. – hmjd
Причина, по которой я спросил это, объясняется тем, что 'datasize' указывается как размер данных и эта цитата из man-страницы для [curl_easy_setopt] (http://www.squarebox.co.uk/cgi-squarebox/manServer/curl_easy_setopt. 3): «Если вы остановите текущую передачу, вернув 0« досрочно »(т.е. до того, как ожидал сервер, например, когда вы сказали, что вы загрузите N байтов и вы загрузите меньше N байтов), вы можете столкнуться с тем, что сервер «зависает», ожидая, пока остальная часть данных не появится ». – hmjd
@ hmjd, 'cout << size' выводит' 102583', и это правильный формат. – Eugeny89