AWS Lambda无法返回PDF文件

sam*_*yst 9 lambda amazon-web-services node.js aws-api-gateway serverless-framework

我使用无服务器创建了一个lambda函数.此函数在GET请求上通过API网关触发,并应从缓冲区返回pdf文件.我正在使用html-pdf创建缓冲区并尝试使用以下命令返回pdf文件

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

但浏览器只是无法加载pdf,所以我不确切知道如何将pdf文件直接返回到浏览器.无法找到解决方案.

sam*_*yst 16

好吧,我找到了答案.我的响应对象中的设置很好,我只需手动更改API网关中的设置,以便在浏览器中工作.我在API网关控制台的二进制设置下为二进制媒体类型添加了"*/*"

API网关

  1. 只需登录您的控制台
  2. 选择你的api
  3. 单击下拉列表中的二进制支持
  4. 编辑二进制媒体类型并添加"*/*"

前端

在新标签中打开api url(target ="_ blank").浏览器可能正在处理编码的base 64响应.在我的情况下使用chrome,浏览器只是在新选项卡中打开pdf,就像我想要的那样.

  • 您能否分享 1)API 网关上究竟做了哪些更改 2)您如何处理客户端上的 base64 编码响应字符串? (2认同)
  • 我将二进制媒体类型设置为"application/pdf",并确保API网关 - 方法响应包含"200"的HTTP状态,其响应主体内容类型为"application/pdf"(空模型).加上"500"的HTTP状态,响应正文内容类型为"text/plain"(空模型),用于发生错误时. (2认同)
  • @HarisMehmood 我将 wkhtmltopdf 分成它自己的 lambda 函数,并有一个 dotnet 核心 webapi 调用该 lambda 函数来获取 base64 编码的字符串。然后我将该字符串 UTF8 解码为一个字节 [] 并将其作为文件从 WebApi 返回。我的问题是来自 webapi 的响应是无效的 pdf 文件。在 apiGateway 的设置页面中添加以下二进制媒体类型后,此问题已得到修复:\*/\* 以及添加内容类型为“application/pdf”和“Empty”模型的 200 OK 方法响应。并重新部署了 API Gateway。让我知道为您修复它 (2认同)

teo*_*omi 9

在花费了几个小时后,我发现如果您将其设置Content handlingConvert to binary(CONVERT_TO_BINARY),则整个响应必须为base64,否则我将收到错误消息:Unable to base64 decode the body

因此,我现在的响应如下所示:

callback(null, buffer.toString('base64'));

整合回应:

在此处输入图片说明

方法响应:

在此处输入图片说明

和二进制媒体类型:

在此处输入图片说明

  • 如果您采用 SAM 方式,请添加以下行 `Globals: Api: BinaryMediaTypes: - application~1pdf ` (2认同)

das*_*mug 6

如果您的PDF很大,那么Lambda会花很长的时间才能返回它,而在Lambda中,您每100毫秒需付费一次。

我先将其保存到S3,然后让Lambda将S3网址返回给客户端进行下载。

  • 还有一个6MB的响应`body'大小限制,需要注意 (4认同)