Почему не получается загрузить фото во ВКонтакте?

Есть такой код. Он работает, может асинхронно загружать картинки на сервер, но мне не хочется создавать лишних файлов, так что я использую BytesIO

import ...

image_url = '...'
vk_session = vk_api.VkApi(token=TOKEN)
api = vk_session.get_api()

upload_url = api.photos.getMessagesUploadServer()['upload_url']

with open('/tmp/photo.jpg', 'wb') as f:
    f.write(httpx.get(image_url).content)
files = {'photo': open('/tmp/photo.jpg', 'rb')}

async def fetch(url, file):
    async with httpx.AsyncClient() as client:
        s = await client.post(url, files=file)
        return s.json()


async def main():
    responses = await asyncio.ensure_future(fetch(upload_url, files))
    print(responses)

if __name__ == '__main__':
    asyncio.run(main())

Но c BytesIO код не работает, поле 'photo' пустое

import ...
image_url = '...'
vk_session = vk_api.VkApi(token=TOKEN)
api = vk_session.get_api()

upload_url = api.photos.getMessagesUploadServer()['upload_url']

files = {'photo': BytesIO(httpx.get(image_url).content)}

async def fetch(url, file):
    async with httpx.AsyncClient() as client:
        s = await client.post(url, files=file)
        return s.json()


async def main():
    responses = await asyncio.ensure_future(fetch(upload_url, files))
    print(responses)


if __name__ == '__main__':
    asyncio.run(main())

Ответ - не ошибка, но поле 'photo' - пустое. Почему так происходит? Как загружать фото на сервера ВКонтакте, не создавая временных файлов?


Ответы (0 шт):