使用libcurl上传文件

uploading file with libcurl

本文关键字:文件 libcurl 使用      更新时间:2023-10-16

看一下下面的代码

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

之后,应用程序什么都不做(甚至不退出)。

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

将感激任何帮助!!

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

CURLOPT_UPLOAD -当选择的协议是HTTP

时,这将要求libcurl PUT文件

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

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

最后留给你们的问题是:

  • 您想要PUT还是POST?

  • 你想提供数据作为一个字符串还是你想提供一个回调?