使用libcurl上传文件

时间:2011-12-20 12:44:47

标签: c++ 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;
}

执行代码时,输​​出以下内容

*** We read 490 bytes from file
*** We read 0 bytes from file

之后应用程序什么也不做(甚至没有退出)。

有人可以指出这里有什么问题吗?

将不胜感激任何帮助!!!

1 个答案:

答案 0 :(得分:6)

此代码中显示了一些严重的混淆。让我试着解释一下:

CURLOPT_UPLOAD - 当选择的协议是HTTP时,这将要求libcurl将PUT文件

CURLOPT_POSTFIELDS - 告诉libcurl POST其他参数中提供的数据(其大小设置为CURLOPT_POSTFIELDSIZE

CURLOPT_READFUNCTION - 为libcurl提供了一种获取数据的替代方法,而不是CURLOPT_POSTFIELDS,以允许POST从文件中读取数据。使用CURLOPT_UPLOAD时,这是提供数据的唯一方法。

所以最后留给你的问题是:

  • 您想要PUT还是POST?

  • 您是想以字符串形式提供数据还是希望通过回调提供数据?