1

我使用serverless创建了lambda函数。这个函数在GET请求中通过API网关触发,并且应该从缓冲区返回一个pdf文件。我使用html-pdf创建缓冲区,并试图用以下命令AWS Lambda返回PDF文件

let response = { 
    statusCode: 200, 
    headers: {'Content-type' : 'application/pdf'}, 
    body: buffer.toString('base64'), 
    isBase64Encoded : true, 
    }; 
    return callback(null, response); 

返回PDF文件,但浏览器只是无法加载PDF,所以我不知道到底如何返回PDF直接将文件上传到浏览器。无法找到解决方案。

+0

我很好奇Base64编码。这是必要的吗? Mayb这是问题吗?我会以二进制格式返回数据。 –

+0

我试过一些变化(也没有bas64编码)。这个建议来自以下链接:https://github.com/serverless/serverless/issues/2797 –

回答

3

好吧,我找到了答案。 我的响应对象中的设置没问题,我只需手动更改API网关中的设置即可在浏览器中工作。我已经下API网关控制台中的二进制设置加“*/*”为二进制的媒体类型

API网关

  1. 只需登录到您的控制台
  2. 选择您的API
  3. 点击二进制数据支持在下拉
  4. 编辑二进制媒体类型,并添加 “*/*”

FRONTEND

在新选项卡中打开api url(target =“_ blank”)。可能浏览器正在处理编码的base64响应,在我使用chrome的情况下,浏览器只是按照我希望的方式在新选项卡中打开pdf。

+0

你能分享 1)在API网关上做了什么改变 2)你如何处理客户端上的base64编码响应字符串? – Shuki

+0

@Shuki刚刚更新了答案,希望这也适用于你 –

+0

@sami_analyst这对我很有用,谢谢你,怪我的'应用程序/ pdf'不起作用,当我上传PDF。 –

1

如果您有一个巨大的PDF,那么Lambda需要很长时间才能将其返回,而在Lambda中,您每100ms收费一次。

我会先将它保存到S3然后让Lambda返回S3 url到客户端进行下载。

+0

上传s3的过程至少需要多少时间?谢谢你的提议,但我必须直接下载文件 –