не удается скачать файл с помощью библиотеки curl, c++
я пытаюсь загрузить на компьютер фотографию, отправленную пользователем. Получаемая ссылка выходит рабочей. При открытии ее через браузер файл успешно скачивается, но при сохранении через код получаем файл с весом 0 КБ
часть кода, отвечающая за загрузку файла
// Функция для записи данных в файл
size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
{
userData.photoUrl = "https://api.telegram.org/file/bot" + bot.getToken() + "/" + filePath;
std::cout << userData.photoUrl;
CURL* curl = curl_easy_init();
FILE* file = fopen("file.jpg", "wb");
curl_easy_setopt(curl, CURLOPT_URL, userData.photoUrl);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(file);
}
Ответы (2 шт):
Думаю, что подводных камней - два:
Токен. Если Вы уверены в том, что токен - валидный, то можно этот пункт игнорировать.
HTTP - заголовки. Дело в том, что curl - штука довольно тупая, работающая по принципу "вот что мне сказали - то я и делаю".
Если Вы включите отладку в браузере, иил используете что то типа wireshark для того, чтобы увидеть обмен между клиентом и сервером - Вы увидите, что в HTTP - заголовке запроса отправляется множество полей. И что curl этого не делает.
А на стороне сервера есть фильтр: в запросе есть необходимый набор полей? - окей, вот тебе файл. Нет набора? Извини, гуляй дальше.
Мне кажется, что чтобы достичь успеха - надо сначала научиться курлом выкачивать картинку изх команднйо строки, а потом уже "запрограммировать" это процесс на C++.
Вот статья о добавлении заголовков к запросу.
Картинка, которая иллюстрирует мои доводы:
Я нашел способ проще без использования библиотеки cURL, ограничившись возможностями библиотеки tgbotcpp.
if (message->photo.empty()) {
// Если фото не было отправлено, ничего не делаем
return;
}
// Получаем ID фотографии с максимальным разрешением
std::string photoId = message->photo.back()->fileId;
// Получаем объект TgBot::Api
TgBot::Api api = bot.getApi();
// Получаем объект TgBot::File с информацией о файле
TgBot::File::Ptr fileInfo = api.getFile(photoId);
std::string filePath = fileInfo->filePath;
// Скачивание файла с помощью downloadFile
std::string fileContent = bot.getApi().downloadFile(filePath);
// Сохранение файла
std::ofstream outputFile(userData.name + ".png", std::ios::binary);
outputFile << fileContent;
outputFile.close();