Как вернуть zip-файл в кодировке Base64 через API-шлюз AWS для загрузки

Я создал лямбда-выражение Python, которое генерирует zip-файл, содержащий сертификат и пароль. Файл закодирован в формате base64 и возвращается с использованием интеграции прокси через шлюз API. При нажатии на шлюз API браузер предлагает загрузить. Ответ сохраняется в файле с расширением zip.

Сохраненный файл по-прежнему закодирован в base64. Конечные пользователи должны получить рабочий zip-файл. Расшифровка файла Base64 дает действительный zip-файл. Пользователь не должен декодировать файл.

Добавление заголовка Content-Encoding приводит к сбою интеграции шлюза API с ошибкой, заключающейся в том, что он не может base64 декодировать ответ от лямбда.

Примечание. Удаление начальных и конечных символов из b64content исправляет функцию str(), помещающую начальный b' и конечный тик. Можете ли вы сказать, что я новичок в Python и AWS? ;-)

                headers = {'Content-Type': 'application/zip,  application/octet-stream',
                           'Content-Disposition': f'attachment; filename="{filename}.zip"'
                           }
                if 'b64' in event['params']:
                    headers['Content-Encoding'] = 'base64'

                response = {
                    'statusCode': 200,
                    'isBase64Encoded': True,
                    'headers': headers,
                    'body': str(b64content)[2:-1],
                }

person CatManDo    schedule 11.11.2020    source источник


Ответы (1)


Ответ был вызван двумя разными проблемами.

Во-первых, пример кода AWS - Python2. Лямбда - это Python3. Кодировка строк и байтов в Python3 изменилась, поэтому байтовому массиву base64 требуется .decode('utf-8') перед его возвратом. (Кодировка не требуется, но явное лучше, чем неявное)

Во-вторых, шлюз API неправильно обрабатывал возвращаемые данные как закодированные в base64. Добавление заголовка content-encoding: base64 заставило API декодировать данные base64 перед их возвратом клиенту.

Этот вопрос об ошибке маршалинга времени выполнения получил мне половину ответа.

person CatManDo    schedule 12.11.2020