Aws lambda 如何通过AWS api网关返回Base64编码的zip文件以供下载

Aws lambda 如何通过AWS api网关返回Base64编码的zip文件以供下载,aws-lambda,aws-api-gateway,Aws Lambda,Aws Api Gateway,我构建了一个python lambda,它生成一个包含证书和密码的zip文件。该文件是base64编码的,并通过API网关使用代理集成返回。使用浏览器提示下载的API网关。响应将保存到具有zip扩展名的文件中 保存的文件仍然是base64编码的。最终用户应收到一个可工作的zip文件。Base64对文件进行解码会生成有效的zip文件。用户不必解码该文件 添加内容编码头会导致API网关集成失败,错误是无法对lambda的响应进行base64解码 注意-从B64内容中删除前导字符和尾随字符修复了放置前

我构建了一个python lambda,它生成一个包含证书和密码的zip文件。该文件是base64编码的,并通过API网关使用代理集成返回。使用浏览器提示下载的API网关。响应将保存到具有zip扩展名的文件中

保存的文件仍然是base64编码的。最终用户应收到一个可工作的zip文件。Base64对文件进行解码会生成有效的zip文件。用户不必解码该文件

添加
内容编码
头会导致API网关集成失败,错误是无法对lambda的响应进行base64解码

注意-从B64内容中删除前导字符和尾随字符修复了放置前导字符和尾随字符的
str()
函数。你能看出我是python和AWS的高手吗?;-)


答案来自两个不同的问题

首先,AWS示例代码是Python2。lambda是蟒蛇3。Python3中字符串和字节的编码已更改,因此需要在返回base64字节数组之前对其进行
.decode('utf-8')
。(编码不是必需的,但是)

其次,API网关没有正确地将返回的数据作为base64编码处理。添加
内容编码:base64
头导致API在将base64数据返回到客户端之前对其进行解码

关于运行时封送错误,我得到了一半的答案

                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],
                }