【发布时间】:2021-07-29 23:53:13
【问题描述】:
有几个类似的问题,但到目前为止,没有一个答案对我有用。
我在由 Serverless 提供支持的 AWS API 网关后面有一个 AWS Lambda 函数,Lambda 应该通过以下方式返回 PDF 文档:
let responseObj = {
statusCode: 200,
isBase64Encoded: true,
headers: {
'Content-type': 'application/pdf',
// 'accept-ranges': 'bytes',
'Content-Disposition': 'attachment; filename=' + pdfName + '.pdf'
},
body: pdfBuffer && pdfBuffer.toString('base64')
}
return responseObj;
当我对 pdfBuffer 的 AWS CloudWatch 执行 console.log() 时(在 base64 之前,它确实看起来像 PDF 数据:
%PDF-1.4
%����
1 0 obj
<</Creator (Chromium)
/Producer (Skia/PDF m90)
...
然而,当我看邮递员时,我看到的是我的身体:
JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PC9DcmVhdG9yIChDaHJvbWl1bSkKL1Byb2R1Y2VyIChTa2lhL1...
所以它显然没有返回二进制文件(我的 pdf)。
查看 API Gateway,建议您将 Binary Media Types 设置为包含 */*。
现在,我的 API 网关有两个端点,当我将其设置为 */* 时,PDF 服务端点确实正确地为我的 PDF 提供服务,但是我有另一个端点接收 JSON 正文,当 @987654334 @ 设置在 Binary Media Types 下,它会错误地/base64 对 JSON 输入进行编码,从而使我的 CSV 端点无用。
将 Binary Media Types 设置为包含 application/pdf 允许我的 CSV 服务端点工作,但我的 PDF 端点恢复为提供垃圾数据,即使手动设置 Accepts 邮递员中的标头到application/pdf。
所以将 Binary Media Types 保留为 application/pdf,我转向 API Gateway UI 设置中的资源:
在这里我有点不确定要编辑哪个。似乎我在侧边栏中有两个选项,一个用于 GET,一个用于 OPTIONS:
OPTIONS - Method Execution 允许我编辑 Integration Response,而 GET - Method Execution 不能。
当我编辑 Integration Response 选项并将 Content Handling 设置为 Convert to binary (if needed) 时,通过 Postman 返回给我的内容似乎没有变化。
必须有一个步骤或我缺少的东西。将 Binary Media Types 设置为包含 */* 似乎是一个错误的答案。必须有一种方法允许某些端点返回二进制数据(如 pdf 文件),同时允许其他端点返回或接受非二进制数据。
【问题讨论】:
-
你有什么运气吗?我在尝试从 Lambda/API 网关提供 PDF 文件时遇到了同样的问题
-
@GerardvandenBosch 我不得不走上正轨才能让它工作,即使那样它也不能完全按照我的意愿去做。您需要删除代理 lambda 集成,然后您可以编辑集成响应。但是你只能传回base64编码的二进制文件(没有头文件),否则如果你尝试包含头文件等,它似乎是二进制文件格式错误。
-
@GerardvandenBosch 也更改为非代理 lambda 集成将影响您将数据传递给 lambda 的方式。
-
@GerardvandenBosch 看到我的回答。如果您找到更好的解决方案,请添加到它(因为它是一个 wiki)。
标签: amazon-web-services aws-lambda aws-api-gateway binaryfiles