看看以下代码
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;
}
执行代码时,输出以下内容
*** We read 490 bytes from file
*** We read 0 bytes from file
之后应用程序什么也不做(甚至没有退出)。
有人可以指出这里有什么问题吗?
将不胜感激任何帮助!!!
答案 0 :(得分:6)
此代码中显示了一些严重的混淆。让我试着解释一下:
CURLOPT_UPLOAD - 当选择的协议是HTTP时,这将要求libcurl将PUT文件
CURLOPT_POSTFIELDS - 告诉libcurl POST其他参数中提供的数据(其大小设置为CURLOPT_POSTFIELDSIZE)
CURLOPT_READFUNCTION - 为libcurl提供了一种获取数据的替代方法,而不是CURLOPT_POSTFIELDS,以允许POST从文件中读取数据。使用CURLOPT_UPLOAD时,这是提供数据的唯一方法。
所以最后留给你的问题是:
您想要PUT还是POST?
您是想以字符串形式提供数据还是希望通过回调提供数据?