@datareset
развиваюсь.

Как сделать, чтобы картинка не обрезалась при отправке через asyncio?

Пытаюсь отправить картинку через asyncio stream,
но приходит она мягко говоря обрезанной
Какие лимиты бы не ставил в reader'е все равно приходит только кусок
recieved = await reader.read(2048)
if recieved.startswith(b"screen"):
                screenshot = recieved.split(b' ')[1]
                with open("image.png", "wb") as f:
                    f.write(screenshot)
                screenshot = InputFile("image.png")
                await bot.send_photo(id, photo=screenshot)

Если выставить лимиты больше, то программа начинает жутко тормозить
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
recieved = await reader.read(2048)
Ты читаешь 2КБ. И всё.
Проблема в том, что размер пакета при передаче по сети ограничен. Хоть гигабайт отправь, приходить будет порциями. И вообще, отправитель (или промежуточное сетевое оборудование) может данные хоть по байту нарезать, ты это не контролируешь.
Поэтому обязательно надо предусматривать какой-то способ определить конце передачи, и повторять чтение в цикле, поке конец не достигнут. Основных способов два.
1. Передавать сначала размер данных в байтах (фиксированным размером - например, как 4байтовое целое), потом сами данные. Читаешь размер, разбираешь его в целое число, читаешь данные, пока не накопится желаемое число байт.
2. После переданных данных передавать условную последовательность "конец передачи". Тогда читаешь данные, пока эта последовательность не встретится.
У тебя данные бинарные, первый способ сработает лучше.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы