【问题标题】:AWS Lambda Python - Return BytesIO file?AWS Lambda Python - 返回 BytesIO 文件?
【发布时间】:2019-07-24 12:35:31
【问题描述】:

我正在使用 python 3.7 在 AWS Lambda 中设置一个函数,它不会让我返回字节类型

请注意,这不是 API Gateway 的问题,我是直接调用 lambda。

错误是:Runtime.MarshalError, ... is not JSON serializable

output = BytesIO()
#Code that puts an excel file into output...
return {
        'Content-Disposition': 'attachment; filename="export.xlsx"',
        'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'body' : output.getvalue()
    }

如果我这样做:

'body' : str(output.getvalue())

它输出了一个损坏的文件,因为它在字符串中添加了b''

如果我这样做:

'body' : base64.b64encode(output.getvalue()).decode()

它还输出一个损坏的文件,可能是因为它改变了文件的二进制表示。

也许我需要上传到 S3?但它不适合我的流程,这是一次性文件创建,它会一直停留在“S3 Limbo”直到 TTL

【问题讨论】:

  • output.getvalue().decode('utf-8') 将解决“不可 JSON 序列化”问题。这会有帮助吗?
  • @MartinValgur 它不是,它是一个二进制字节流,它给出了 'utf-8' 编解码器无法解码位置 16 中的字节 0xda:无效的继续字节
  • @MartinValgur 不是,这个问题与 api 网关有关,我已经提到我没有使用它
  • 你试过 output.read() 吗?

标签: python-3.x amazon-web-services aws-lambda serverless-framework


【解决方案1】:

无法从直接调用的 AWS Lambda 函数返回未编码的二进制数据。

根据docs

如果处理程序返回无法被 json.dumps 序列化的对象,则运行时返回错误。

您可以使用 API Gateway 执行此操作的原因是,API Gateway 正在将您的函数返回的 base64 JSON 内容转换为二进制文件。 (参见文档here

我需要了解更多关于您如何调用 Lambda 的信息才能确定,但​​我怀疑您可以在您的直接调用客户端中实现相同的 base64 解码逻辑。或者,如果您想让客户端尽可能简单,请使用带有生命周期挂钩的 S3 来防止存储桶被临时文件填满。

【讨论】:

  • 投反对票很有趣。抱歉,无论您多么不喜欢它,您都无法从直接调用的 lambda 中返回未编码的二进制流。
  • 这个答案现在过时了吗?您的链接现在指向标题为“通过 API 网关启用二进制支持”的页面
  • 哦,进一步阅读后,似乎只有通过 S3 存储桶而不是使用 lambda 作为集成类型才有可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2019-05-03
  • 2021-08-22
  • 1970-01-01
  • 2021-07-29
  • 2018-01-21
相关资源
最近更新 更多