我使用serverless创建了一个lambda函数。此函数通过API Gateway在GET请求时触发,应该从缓冲区返回pdf文件。我使用html-pdf创建缓冲区,并尝试使用以下命令返回pdf文件
let response = {
statusCode: 200,
headers: {'Content-type' : 'application/pdf'},
body: buffer.toString('base64'),
isBase64Encoded : true,
};
return callback(null, response);
但是浏览器无法加载PDF文件,所以我不知道如何将PDF文件直接返回到浏览器。找不到解决方案。
6条答案
按热度按时间t5fffqht1#
好吧,我找到了答案。在我的响应对象中的设置是好的,我只需要手动更改API网关中的settings,以便在浏览器中工作。我已经在API网关控制台的二进制设置下将"/"添加到二进制媒体类型中
API网关
1.只需登录到您控制台
1.选择你的api
1.在下拉菜单中单击二进制支持
1.编辑二进制媒体类型并添加"/"
前端
在新标签页中打开API URL(target ="_blank")。可能浏览器正在处理编码的Base 64响应,在我使用Chrome的情况下,浏览器只是在新标签页中打开PDF,完全像我希望它做的那样。
lx0bsm1f2#
在花了几个小时之后,我发现如果将
Content handling
设置为Convert to binary
(CONVERT_TO_BINARY),则整个响应必须为base64,否则我会得到一个错误:Unable to base64 decode the body
.因此,我现在的回答如下:
callback(null, buffer.toString('base64'));
集成响应:
方法响应:
和二进制媒体类型:
hsgswve43#
如果你有一个巨大的PDF文件,那么Lambda需要很长时间才能返回它,而在Lambda中,每100ms就要向你收费。
我会先将其保存到S3,然后让Lambda将S3 URL返回给客户端进行下载。
xzabzqsa4#
我有一个类似的问题,其中pdf下载为base64,并开始发生时,改变serverles.yml文件从:
到
问题是因为AWS实现此功能的方式。来自AWS文档here:
当一个请求在其Accept标头中包含多个媒体类型时,API Gateway仅接受第一个Accept媒体类型。如果您无法控制Accept媒体类型的顺序,并且二进制内容的媒体类型不是列表中的第一个,请在API的binaryMediaTypes列表中添加第一个Accept媒体类型。API Gateway将此列表中的所有内容类型作为二进制处理。
基本上,如果accept请求头中包含的第一个媒体类型不在binaryMediaTypes列表中,那么您将得到base64。
我在浏览器中检查了请求,接受头中的第一个媒体类型是text/html,因此我在将设置更改为以下内容后使其工作:
希望这对任何有同样问题的人有帮助。
8ulbf1ek5#
以上解决方案仅适用于特定内容类型。您不能选择其他内容类型。请仅按照以下两个步骤解决多内容类型问题。
1.单击“使用Lambda代理”集成复选框
API网关--〉API --〉方法--〉集成请求
1.将您的响应创建为
注 * -不安全
h43kikqp6#
与其这样做,不如在你的serverless.yaml文件中使用
serverless-apigw-binary
插件。加
希望这能帮上忙。