Есть такой код. Он работает, может асинхронно загружать картинки на сервер, но мне не хочется создавать лишних файлов, так что я использую 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' - пустое. Почему так происходит? Как загружать фото на сервера ВКонтакте, не создавая временных файлов?