python - 如何使用 multipart/form-data 创建一个将 pdf 文件作为输入的 AWS Lambda/API 网关 python 函数?
问题描述
我已经为此苦苦挣扎了一段时间。我需要在 API 网关中创建一个资源,该资源链接到一个 lambda 函数,该函数将 pdf 文件作为输入作为 multipart/form-data 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。
以下是我的文件:
Servlerlss.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'"
处理程序.py
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)
解决方案
经过大量 google 并在 AWS 支持团队的帮助下,我终于设法解决了这个问题。
事实证明,API 网关会检查传入请求中的标头:“Content-Type”或“Accept”,并将其与Binary Media Type的设置相匹配,以决定将哪个有效负载视为二进制。这意味着我们需要将两种内容类型(multipart/form-data、application/pdf)指定为Binary media type。
可以通过使用 serverless -apigw-binary并将这些添加到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 解决。谢谢你的克里斯。我只是想知道你是怎么想到的...
无服务器.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'"
推荐阅读
- python - fold_idx 的真正含义是什么,它有什么作用?
- dataframe - 如何在 Julia Dataframe 中添加新列
- jquery - MVC Controller 和 MVC ControllerBase 中的 httppost 函数相同,但在 ControllerBase 中发现错误
- javascript - JsPsych 为调查文本试验设置计时器
- python - 在不使用 Python 的内置可迭代函数的情况下从单词列表中对字谜进行分组
- c# - Visual Studio 项目项模板无法将引用程序集添加到 .NET 5 项目
- node.js - 通过 Node js 读取 HTML 文件的内容
- microsoft-graph-api - 如何从 Microsoft 个人帐户中获取组列表
- python - 在 Python 中绘制正方形
- kubernetes - 如何列出在特定区域中运行的 pod?