Я успешно использовал модуль requests для загрузки двоичного файла (jpg) с чем-то как следующее:
upload_url = 'http:10.1.1.1:8080/api/media/photo'
headers = {'Authorization': token_string, 'Content-Type': 'image/jpg'}
data = open('photo.JPG', 'rb')
params = {'name': 'photo.JPG'}
r = requests.post(upload_url, params=params, data=data, headers=headers)
Теперь пытаемся сделать это с помощью клиента http://aiohttp.readthedocs.org/en/latest/client.html. Это то, что у меня есть до сих пор:
def upload_photos(token):
upload_url = '10.0.1.1:8080/api/media/photo'
headers = {'Authorization': token, 'Content-Type': 'image/jpg'}
data = {'file': open('photo.JPG', 'rb')}
params = {'name': 'photo.JPG'}
r = yield from aiohttp.request('post', upload_url, params=params, data=data, headers=headers)
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(upload_photos(token))
Но мне возвращают 400 с {"detail": "Specified value is invalid: Invalid Content-Length specified"}
.
Как будто неправильно отправляет фото.jpg. В документах aiohttp упоминаются файлы с кодировкой из нескольких частей и потоковая передача, но это не то, чего я хочу здесь.
Как мне сформировать аналогичный POST с двоичным файлом, как в запросах, но с aiohttp?