我正在将我的NodeJS项目迁移到API网关,我无法弄清楚如何从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});
});
答案 0 :(得分:1)
API Gateway本身不支持二进制数据。我们的一些客户已成功使用Lamb64编码数据,包括JSON响应和使用响应映射模板解码数据以响应客户端。
答案 1 :(得分:1)
API Gateway
不支持发送二进制响应。作为替代方案,您可以将Lambda
存储二进制数据放在S3
中,并通过HTTP
标题返回S3
重定向到Location
对象位置。