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 を取得できました。
これは、サーバーレスを使用したラムダ関数のスニペットです。
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 の応答オブジェクトへの参照を取得する方法がわかりません。それは可能ですか?別の方法はありますか?
アップデート
最終的に、base64 でエンコードされた PDF バイナリを JSON 応答で返し、クライアントでデコードすることで、この問題を解決しました。注: 応答マッピング テンプレートで 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});
});