После отправки файла через Telegram файл приходит битым
решил реализовать возможность пользователю хранить исполняемые файлы в боте(aiogram).
Для начала я получаю файл, читаю все его биты, кодирую в base64 и записываю это в бд.
Когда пользователь просит файл я достаю base64 из базы, декодирую, записываю в файл биты и отправляю пользователю.
Проблема:
Когда я отправляю файл через метод bot.send_document() файл приходит битым, т.е не работает. Я проверил все этапы и на каждом этапе файл рабочий, работает даже тот файл что получился после декодирования base64 из базы, и он тоже запускается но отправленный файл не запускается и скорей всего является битым.
Так же я сравнил base64 и биты при получении и при извлечении из базы, они одинаковые! Т.е я считаю что проблема не на моей стороне т.к у меня всё работает.
Вот некоторые куски кода(python), и библиотека для создания base64 кода:
base64 - ссылка
Функция для создания файла из base64, входные данные:
name - имя файла
base - base64
def write_file_bit(self, name, base):
file = open(f'{name}', 'wb')
base64_string = base64.b64decode(base)
file.write(base64_string)
Функция для создания base64 из байтов, входные данные:
bytes - байты полученные из файла
def bytes_to_base(self, bytes):
base64_string = base64.b64encode(bytes)
return base64_string
Получение файла и добавление в базу:
data = await state.get_data()
document_id = msg.document.file_id
file_info = await bot.get_file(document_id)
fi = file_info.file_path
name = msg.document.file_name
r = requests.get(f'https://api.telegram.org/file/bot{TOKEN}/{fi}', f'./{name}')
bytes = r.content
base = file_work.bytes_to_base(bytes)
try:
database.add_to_queue_exe(msg.from_user.id, base, name, data['name_service'])
create_buttons(['Вернуться на главную?'])
await bot.send_message(msg.from_user.id, f'Программа успешно добавлена,её можно посмотреть в личном кабинете', reply_markup=greet_kb)
except Exception as e:
print(e)
create_buttons(['Вернуться на главную?'])
await bot.send_message(msg.from_user.id, f'Неизвесная ошибка❌ Пожалуйста сообщите администрации', reply_markup=greet_kb)
Получение base64 из базы, создание файла и отправка пользователю:
base = database.get_base_file_user(exes[couter][3])[2:-1]
random_name = random.randint(1,157153717531753715371)
expansion = exes[couter][1][str(exes[couter][1]).rfind('.') + 1:]
file_work.write_file_bit(f'{random_name}.{expansion}', base)
await bot.send_document(user_msg.from_user.id, (exes[couter][1], f'{random_name}.{expansion}'))
#os.remove(f'{random_name}.{expansion}')
Тут в конце я закомментировал строку удаления файла после создания, этот файл РАБОЧИЙ
Если коротко повторю проблему, файл приходит не рабочим и проблема точно не на моей стороне. Заранее спасибо за помощь!
Ответы (1 шт):
Проблема была в том что в методе send_message() я вставил название файла где должно было быть его содержимое. Желаю всем быть более внимательным чем я :)