2

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

这是我本地 Node 项目的响应代码片段。

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 函数的片段。

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});
});
4

2 回答 2

2

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

于 2016-09-22T20:01:42.767 回答
1

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

于 2016-09-22T00:40:33.880 回答