У меня есть этот код, как показано ниже
#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
Я не смог найти ни одного документа, подробно рассказывающего о размере файла загрузки.
После изменения этой строки:
к
Я получаю правильный размер в журнале.
Кодировка фрагментов изменяет тело сообщения, чтобы передать его в виде серии фрагментов, каждый со своим собственным индикатором размера, за которым следует дополнительный трейлер, содержащий поля заголовка сущности Ref .
Но я должен использовать chunked. Есть ли какой-либо способ получить правильные загруженные данные