curl_easy_getinfo не возвращает правильный размер после загрузки

У меня есть этот код, как показано ниже

#include <stdio.h>
#include <curl/curl.h>
#include <iostream>
using namespace std;

size_t read_file_data(char* buffer, size_t size,
                      size_t nitems, void* instream) {
    printf("nUpload file binary data");
    cout << "Read" << nitems << " items by " << size << " bytes" << endl;

    size_t retcode = fread(buffer, size, nitems,
                           static_cast<FILE*>(instream));
    size_t retsize = size * retcode;
    cout << "Read " << retsize << "bytes from filen";
    return retsize;
}

int main(void)
{
    CURL* curl = curl_easy_init();
    if (!curl) {
      return 1;
    }
    curl_easy_setopt(curl, CURLOPT_URL, "http://172.30.191.145:3000/upload");

    struct curl_slist* chunk = NULL;
    chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");
    chunk = curl_slist_append(chunk,
                              "Content-type:application/octet-stream");
    chunk = curl_slist_append(chunk, "Session: test");
    CURLcode result = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
    FILE* fp = 
        fopen("/home/thinh/Documents/SDL/curlupload/testfile.txt","rb");

    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    curl_easy_setopt(curl, CURLOPT_READFUNCTION,
                     &read_file_data);
    curl_easy_setopt(curl, CURLOPT_READDATA, fp);

    result = curl_easy_perform(curl);
    cout << "curl result " << result << endl;

    CURLcode get_info_result;
    double val = 0;
    get_info_result = curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &val);
    if (CURLE_OK == get_info_result) {
      printf("Size of uploaded data:  %0.0f bytes.n", val);
    } else {
      printf("ERROR");
    }

    curl_easy_cleanup(curl);
    curl_slist_free_all(chunk);
    fclose(fp);

    return 0;
}

После выполнения размер загруженных данных всегда превышает фактический размер файла.
Но файл после загрузки в сервер корректен(то же самое с локальным файлом)
Я использую ll commandдля проверки размера файла

проблема в этой строке

get_info_result = curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &val);

Например: я загружаю текст локального файла.txt 1022 байт, но в журнале: «размер загруженных данных: 1034 байт.», в сервере 1022 байт.
текст.содержание txt:

abcd123
abcd123
abcd123

Я не смог найти ни одного документа, подробно рассказывающего о размере файла загрузки.

1 ответ

  1. После изменения этой строки:

    chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");
    

    к

    chunk = curl_slist_append(chunk, "Transfer-Encoding: ");
    

    Я получаю правильный размер в журнале.
    Кодировка фрагментов изменяет тело сообщения, чтобы передать его в виде серии фрагментов, каждый со своим собственным индикатором размера, за которым следует дополнительный трейлер, содержащий поля заголовка сущности Ref .

    Но я должен использовать chunked. Есть ли какой-либо способ получить правильные загруженные данные