使用libcurl上传文件

Eug*_*y89 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

*** We read 490 bytes from file
*** We read 0 bytes from file
Run Code Online (Sandbox Code Playgroud)

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

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

将不胜感激任何帮助!

Dan*_*erg 6

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

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

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

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

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

  • 你想要PUT还是POST?

  • 您想要将数据作为字符串提供还是希望它提供回调?