【问题标题】:API Gateway Response Download File using Node, PDFMake, Serverless使用 Node、PDFMake、Serverless 的 API 网关响应下载文件
【发布时间】:2017-07-10 06:02:43
【问题描述】:

我正在将我的 NodeJS 项目迁移到 API Gateway,但我不知道如何从 Lambda 下载文件。

这是我本地 Node 项目的响应代码的 sn-p。

app.get('/downloadPDF', function (req, res) {
  res.setHeader('Content-disposition', 'attachment; filename=test.pdf');
  res.setHeader('Content-type', 'application/pdf');
  var PdfPrinter = require('pdfmake');
  var printer = new PdfPrinter(fonts);

  var pdfDoc = printer.createPdfKitDocument(dd);
  pdfDoc.pipe(res);
  pdfDoc.end();
});

响应我能够取回 PDF 的响应。

这是我使用无服务器的 lambda 函数的 sn-p。

module.exports.createPDF = (event, context) => {
  var PdfPrinter = require('pdfmake');
  var printer = new PdfPrinter(fonts);

  var pdfDoc = printer.createPdfKitDocument(dd);
  pdfDoc.pipe(res);
  pdfDoc.end();
}

这是我的 serverless.yml 中的端点

createPDF:
handler: functions.myFunction
events:
  - http:
      path: services/getPDF
      method: get
      response:
        headers:
          Content-Type: "'application/pdf'"
          Content-disposition: "'attachment; filename=test.pdf'"

我不知道如何在 Lambda 中获取对响应对象的引用以进行管道传输。那可能吗?还有其他方法吗?


更新

我最终通过在 JSON 响应中返回 base64 编码的 PDF 二进制文件并在客户端进行解码来解决此问题。 注意:在响应映射模板中使用 base64 解码不起作用。

示例代码:

    var buffers = [];
pdfDoc.on('data', buffers.push.bind(buffers));

pdfDoc.on('end', function () {
    var bufCat = Buffer.concat(buffers);

    var pdfBase64 = bufCat.toString('base64');

return cb(null, 
    {"statusCode": 200,
    "headers": {"Content-Type": "application/json"},
    "body": pdfBase64});
});

【问题讨论】:

    标签: node.js aws-lambda aws-api-gateway pdfmake serverless-framework


    【解决方案1】:

    API Gateway 不支持发送二进制响应。作为替代方案,您可以让您的Lambda 将二进制数据存储在S3 中,并通过Location 标头将HTTP 重定向到S3 对象位置。

    【讨论】:

    • 很好的建议,我相信这会奏效,但是目前存储不符合要求。我希望这对其他人有帮助!
    【解决方案2】:

    API Gateway 本身不支持二进制数据。我们的一些客户已经成功地在 Lambda 中对数据进行 base64 编码,包括在 JSON 响应中以及使用响应映射模板对数据进行解码以响应客户端。

    【讨论】:

    • 感谢您的建议!不幸的是,我没有成功走这条路,但它给了我一些响应映射模板的经验。
    猜你喜欢
    • 2019-11-26
    • 2020-07-08
    • 1970-01-01
    • 2020-05-22
    • 2017-12-10
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多