gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:06:22 25 4
gpt4 key购买 nike

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

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

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

命令/文件:

curl

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

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

以下是我的文件:

Servelerlss.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'"

handler.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)

最佳答案

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

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

通过使用 serverless-apigw-binary 可以使用 serveless 来做到这一点并将这些添加到 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 解决.谢谢你的克里斯。我只是想知道你是怎么想出来的...


Serverless.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 - 如何使用 multipart/form-data 创建一个将 pdf 文件作为输入的 AWS Lambda/API 网关 python 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54610903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com