相关文章推荐
淡定的蚂蚁  ·  QTreeView 修改节点字体 ...·  4 月前    · 
成熟的春卷  ·  php pdf转word-掘金·  1 年前    · 

如何通过AWS Lambda(python)返回io.BufferedReader?

1 人关注

我试图从S3桶中读取一个文件,在io.BufferedReader中获得该文件,并通过lambda函数返回,随后将解码为JSON。 我得到的错误信息是

无法处理响应。BufferedReader类型的对象不是JSON可序列化的。

我的代码如下。

s3 = boto3.client('s3')
def lambda_handler(event, context):
    bucket = "bucketID"
    body = []
    for record in event['key']:
        with open('/tmp/2021-10-11T06:23:29:691472.pdf', 'wb') as f:
            s3.download_fileobj(bucket, "basedir/file.pdf", f)
        f = open("/tmp/2021-10-11T06:23:29:691472.pdf", "rb")
    body.append(f)
    return {
        "statusCode": 200,
        "file":f,
        "content":f.read()

来自lambda的错误响应

Response
  "errorMessage": "Unable to marshal response: Object of type BufferedReader is not JSON serializable",
  "errorType": "Runtime.MarshalError",
  "requestId": "10aea120-kyc-jpk-bnce-7123eTyda64",
  "stackTrace": []

我正在使用AWS-Lambda Python函数

1 个评论
你有没有试过 f.read().dumps()
python
amazon-web-services
amazon-s3
aws-lambda
SREERAG R NANDAN
SREERAG R NANDAN
发布于 2021-10-13
1 个回答
Marcin
Marcin
发布于 2021-10-13
已采纳
0 人赞同

f.read() 返回字节,JSON不支持二进制数据。另外 是不正确的。我猜它应该是一个文件名。无论如何,通常你会在JSON中返回二进制数据,如 。 "file":f base64

import base64
s3 = boto3.client('s3')
def lambda_handler(event, context):
    bucket = "document.as.a.service.test"
    body = []
    for record in event['uuid_filepath']:
        with open('/tmp/2021-10-11T06:23:29:691472.pdf', 'wb') as f:
            s3.download_fileobj(bucket, "123TfZ/2021-10-11T06:23:29:691472.pdf", f)
        f = open("/tmp/2021-10-11T06:23:29:691472.pdf", "rb")
    body.append(f)
    return {
        "statusCode": 200,