2011-12-20 4 views
1

Взгляните на следующий кодзагрузки файлов с 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 

после этого приложение не делает ничего (даже не выходя).

Может кто-нибудь указать, что здесь не так?

Будем благодарны за любую помощь !!!

+1

Вы можете проверить возвращаемое значение из 'stat()', чтобы убедиться, что оно выполнено успешно, и 'file_info.st_size' верен. – hmjd

+1

Причина, по которой я спросил это, объясняется тем, что 'datasize' указывается как размер данных и эта цитата из man-страницы для [curl_easy_setopt] (http://www.squarebox.co.uk/cgi-squarebox/manServer/curl_easy_setopt. 3): «Если вы остановите текущую передачу, вернув 0« досрочно »(т.е. до того, как ожидал сервер, например, когда вы сказали, что вы загрузите N байтов и вы загрузите меньше N байтов), вы можете столкнуться с тем, что сервер «зависает», ожидая, пока остальная часть данных не появится ». – hmjd

+0

@ hmjd, 'cout << size' выводит' 102583', и это правильный формат. – Eugeny89

ответ

6

В этом коде есть некоторые серьезные недоразумения. Позволь мне объяснить:

CURLOPT_UPLOAD - это попросит Libcurl поместить файл, когда протокол выбора является HTTP

CURLOPT_POSTFIELDS - говорит Libcurl для POST данных, содержащиеся в дополнительном аргументе (который имеет размер устанавливается с CURLOPT_POSTFIELDSIZE)

CURLOPT_READFUNCTION - обеспечивает libcurl альтернативный способ получения данных, чем CURLOPT_POSTFIELDS, чтобы позволить POST считывать данные из файла. При использовании CURLOPT_UPLOAD это единственный способ предоставить данные.

Таким образом, в конце концов, вопросы оставил для вас:

  • Вы хотите PUT или POST?

  • Вы хотите предоставить данные в виде строки или вы хотите, чтобы она была включена с обратным вызовом?

Смежные вопросы