繁体   English   中英

如何使用 multipart/form-data 创建一个将 pdf 文件作为输入的 AWS Lambda/API 网关 python 函数?

[英]How to create an AWS Lambda/API gateway python function that takes a pdf file as input using multipart/form-data?

我已经为此苦苦挣扎了一段时间。 我需要在 API 网关中创建一个资源,该资源链接到一个 lambda 函数,该函数将 pdf 文件作为作为多部分/表单数据 POST 请求发送的输入。 为简单起见,我现在只是返回文件。

当我尝试使用以下 curl 调用 API 时,我收到来自 AWS 的内部服务器错误 有没有人成功地将 pdf 文件发送到 Lambda 而不必使用 S3 技巧(上传到 S3)?

提前感谢大家的任何提示。

命令/文件:

卷曲

curl -vvv -X POST -H "Content-Type: multipart/form-data" -F "content=@file.pdf" https://...MYAPIHERE.../pdf

我目前正在使用无服务器和 python3。

以下是我的文件:

服务端.yaml

function:
  pdf:
    handler: handler.pdf
    events:
      - http:
          path: /pdf
          method: post 
          integration: lambda
          request:
            template:
              application/json: "$input.json('$')"
          response:
            headers:
              Content-Type: "'aplication/json'"

处理程序

def pdf(event, context):
    pdf = event.get('content')
    out = {'statusCode': 200,
           'isBase64Encoded': False,
           'headers': {"content-type": "application/json"},
           'body': json.dumps({
               'input':  pdf,
               'inputType': 'url',
               #'tags': list(tags.keys()),
               'error': None})}
    return(out)

经过大量的谷歌搜索并在 AWS 支持团队的帮助下,我终于设法解决了这个问题。

事实证明,API 网关会检查传入请求中的标头:“Content-Type”或“Accept”,并将其与Binary Media Type的设置进行匹配,以决定将哪个有效负载视为二进制。 这意味着我们需要指定两种内容类型(multipart/form-data、application/pdf)作为Binary media type

这可以通过使用做到这一点使用serveless无服务器- apigw二进制和添加这些到serverless.yaml:

plugins:
  - serverless-apigw-binary 

custom:
  apigwBinary:
    types:           #list of mime-types
      - 'multipart/form-data'
      - 'application/pdf'

但是由于 lambda 需要来自 API 网关的application/json格式的有效负载,因此无法直接传递二进制数据。 因此,ContentHandling 的设置应设置为“CONVERT_TO_TEXT”。 在 yaml 文件中,这转换为:

contentHandling: CONVERT_TO_TEXT

Kris Gohlson 在 serverless -thumbnail 上解决了最后一个问题。 谢谢你的克里斯。 我只是想知道你是怎么想到这个的...


无服务器.yaml

plugins:
  - serverless-apigw-binary 

custom:
  apigwBinary:
    types:           #list of mime-types
      - 'multipart/form-data'
      - 'application/pdf'

function:
  pdf:
    handler: handler.pdf
    events:
      - http:
          path: /pdf
          method: post 
          integration: lambda
          request:
            contentHandling: CONVERT_TO_TEXT
            passThrough: WHEN_NO_TEMPLATES
            template:
              application/pdf: "{'body': $input.json('$')}"
              multipart/form-data: "{'body': $input.json('$')}"
          response:
            contentHandling: CONVERT_TO_BINARY
            headers:
              Content-Type: "'aplication/json'"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM