libcurl不上传整个文件

时间:2014-03-18 15:15:36

标签: c++ file-upload libcurl

我正在尝试将文件上传到http服务器。我从服务器获得200 OK,但下面的代码只传输4个字节。

size_t myclass::read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{
    handler->read(buffer, buffer_size);   // buffer_size is 100000

    size_t res = handler->gcount();
    if( res == 0 )
        return 0;

    ptr = buffer;   // buffer is array of char, defined in myclass
    size = res;
    nmemb = sizeof(char);

    return 1;
}


void myclass::upload_function(const std::string& url)
{
    CURL *curl;
    CURLcode res;

    std::ifstream if_file;
    if_file.open("/path_to_file", std::ios::binary);
    handler = &if_file;   // handler is defined in myclass

    /* In windows, this will init the winsock stuff */
    res = curl_global_init(CURL_GLOBAL_DEFAULT);
    /* Check for errors */
    if(res != CURLE_OK) {
        // failure
        return;
    }    


    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "hostname");
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, myclass::read_callback);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

        struct curl_slist *chunk = NULL;
        chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");
        chunk = curl_slist_append(chunk, "Content-Type: application/x-mpegURL");
        res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);

        /* Perform the request, res will get the return code */
        res = curl_easy_perform(curl);
        /* Check for errors */
        if(res != CURLE_OK) {
            // failed
        }
        else 
        {
            double speed_upload, total_time;
            curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed_upload);
            curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);

            fprintf(stderr, "Speed: %0.3f b/sec during %.3f seconds\n",
              speed_upload, total_time);
        }
        /* always cleanup */
        curl_easy_cleanup(curl);        
    }
    curl_global_cleanup();
    if_file.close();

}

1 个答案:

答案 0 :(得分:1)

回调似乎并没有将数据复制到缓冲区。它只是分配本地指针,完全没有任何影响。

回调看起来像是一个C ++方法,不能用作C API中的回调,它不知道C ++对象......