AWS Lambda无法返回PDF文件

时间:2017-07-27 10:47:11

标签: node.js amazon-web-services lambda aws-api-gateway serverless-framework

我使用serverless创建了一个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);

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

4 个答案:

答案 0 :(得分:14)

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

API GATEWAY

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

    在新标签中打开api url(target =" _blank")。可能浏览器正在处理编码的base 64响应。在我的chrome案例中,浏览器只是在新标签页中打开pdf,就像我想要的那样。

答案 1 :(得分:5)

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

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

答案 2 :(得分:5)

在此上花费了几个小时后,我发现如果将Content handling设置为Convert to binary(CONVERT_TO_BINARY),则整个响应必须为base64,否则我将得到一个错误:Unable to base64 decode the body

因此,我的回复现在看起来像:

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

集成响应:

enter image description here

方法响应:

enter image description here

和二进制媒体类型:

enter image description here

答案 3 :(得分:0)

以上解决方案仅适用于特定的内容类型。您不能再输入更多内容类型。 请仅按照以下两步操作来解决多种内容类型问题。

  1. 点击“使用Lambda代理集成”复选框

API网关-> API->方法->集成请求

enter image description here

enter image description here

  1. 创建您的回复

    让响应= {

          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;
    

注意*-不安全