Укажите имя файла для файлового объекта, созданного с помощью urlopen() или reports.get()

Я строю бот Telegram с помощью библиотеки Telepot. Чтобы отправить изображение, загруженное из Интернета, мне нужно использовать метод sendPhoto, который принимает объект в виде файла.

Просматривая документы, я нашел этот совет:

Если подобный файлу объект получен urlopen() вам, скорее всего, придется указать имя файла, потому что серверам Telegram требуется знать расширение файла.

Вопрос в том, получу ли я свой файлоподобный объект, открыв его requests.get и оборачивать BytesIO вот так:

res = requests.get(some_url)
tbot.sendPhoto(
    messenger_id,
    io.BytesIO(res.content)
)

как и где мне указать имя файла?

1 ответ

Решение

Вы должны указать имя файла в качестве объекта .name приписывать.

Открытие файла с open() имеет атрибут.name

>>>local_file = open("file.txt")
>>>local_file
<open file 'file.txt', mode 'r' at ADDRESS>
>>>local_file.name
'file.txt'

Где открытие URL не имеет. Именно поэтому в документации конкретно упоминается об этом.

>>>import urllib
>>>url_file = urllib.open("http://example.com/index.hmtl")
>>>url_file
<addinfourl at 44 whose fp = <open file 'nul', mode 'rb' at ADDRESS>>
>>>url_file.name
AttributeError: addinfourl instance has no attribute 'name'

В вашем случае вам нужно будет создать файлоподобный объект и дать ему .name атрибут:

res = requests.get(some_url)
the_file = io.BytesIO(res.content)
the_file.name = 'file.image'

tbot.sendPhoto(
    messenger_id,
    the_file
)
Другие вопросы по тегам