NodeJS AWS Lambda无法返回PDF文件

emeijp43  于 2023-01-16  发布在  Node.js
关注(0)|答案(6)|浏览(158)

我使用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文件直接返回到浏览器。找不到解决方案。

t5fffqht

t5fffqht1#

好吧,我找到了答案。在我的响应对象中的设置是好的,我只需要手动更改API网关中的settings,以便在浏览器中工作。我已经在API网关控制台的二进制设置下将"/"添加到二进制媒体类型中
API网关
1.只需登录到您控制台
1.选择你的api
1.在下拉菜单中单击二进制支持
1.编辑二进制媒体类型并添加"/"
前端
在新标签页中打开API URL(target ="_blank")。可能浏览器正在处理编码的Base 64响应,在我使用Chrome的情况下,浏览器只是在新标签页中打开PDF,完全像我希望它做的那样。

lx0bsm1f

lx0bsm1f2#

在花了几个小时之后,我发现如果将Content handling设置为Convert to binary(CONVERT_TO_BINARY),则整个响应必须为base64,否则我会得到一个错误:Unable to base64 decode the body.
因此,我现在的回答如下:
callback(null, buffer.toString('base64'));
集成响应:

方法响应:

和二进制媒体类型:

hsgswve4

hsgswve43#

如果你有一个巨大的PDF文件,那么Lambda需要很长时间才能返回它,而在Lambda中,每100ms就要向你收费。
我会先将其保存到S3,然后让Lambda将S3 URL返回给客户端进行下载。

xzabzqsa

xzabzqsa4#

我有一个类似的问题,其中pdf下载为base64,并开始发生时,改变serverles.yml文件从:

binaryMediaTypes:
      - '*/*'

binaryMediaTypes:
      - 'application/pdf'
      - '....other media types'

问题是因为AWS实现此功能的方式。来自AWS文档here
当一个请求在其Accept标头中包含多个媒体类型时,API Gateway仅接受第一个Accept媒体类型。如果您无法控制Accept媒体类型的顺序,并且二进制内容的媒体类型不是列表中的第一个,请在API的binaryMediaTypes列表中添加第一个Accept媒体类型。API Gateway将此列表中的所有内容类型作为二进制处理。
基本上,如果accept请求头中包含的第一个媒体类型不在binaryMediaTypes列表中,那么您将得到base64。
我在浏览器中检查了请求,接受头中的第一个媒体类型是text/html,因此我在将设置更改为以下内容后使其工作:

binaryMediaTypes:
          - 'application/pdf'
          - '....other media types'
          - 'text/html'

希望这对任何有同样问题的人有帮助。

8ulbf1ek

8ulbf1ek5#

以上解决方案仅适用于特定内容类型。您不能选择其他内容类型。请仅按照以下两个步骤解决多内容类型问题。
1.单击“使用Lambda代理”集成复选框
API网关--〉API --〉方法--〉集成请求

1.将您的响应创建为

let response = {

      statusCode: 200,
      headers: {
        'Content-type': 'application/pdf',//you can change any content type
        'content-disposition': 'attachment; filename=test.pdf' // key of success
      },
      body: buffer.toString('base64'),
      isBase64Encoded: true
    };
    return response;

注 * -不安全

h43kikqp

h43kikqp6#

与其这样做,不如在你的serverless.yaml文件中使用serverless-apigw-binary插件。

plugins:
- serverless-apigw-binary

custom:
   apigwBinary:
    types:
      - "application/pdf"

希望这能帮上忙。

相关问题