Загрузка файла сервера aiohttp: request.post UnicodeDecodeError - PullRequest
0 голосов
/ 25 мая 2020

У меня есть веб-сервис в Flask, который обрабатывает загруженные двоичные данные:

@app.route('/v1/something', methods=['POST'])
def v1_something():
    for name in request.files:
        file = request.files[name]
        file.read()
        ...

Теперь я переписываю его на AIOHTTP, но у меня проблемы с обработкой файлов. Мой код:

@routes.post('/v1/something')
async def v1_something(request):
    files = await request.post()
    for name in files:
        file = files[name]
        file.read()
        ...

Я получаю сообщение об ошибке в строке await request.post():

UnicodeDecodeError: код 'utf-8' c не может декодировать байт 0x80 в позиция 14: недопустимый начальный байт

Похоже, AIOHTTP пытается прочитать данный двоичный файл как текст. Как я могу этого избежать?

1 Ответ

1 голос
/ 25 мая 2020

Я решил прочитать исходный код и обнаружил, что request.post() предназначен для application/x-www-form-urlencoded и multipart/form-data, поэтому он всегда пытается проанализировать данные как текст. Я также обнаружил, что должен использовать request.multipart():

@routes.post('/v1/something')
async def v1_something(request):
    async for obj in (await request.multipart()):
        # obj is an instance of aiohttp.multipart.BodyPartReader
        if obj.filename is not None:  # to pass non-files
            file = BytesIO(await obj.read())
            ...
...