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 を取得できました。

これは、サーバーレスを使用したラムダ関数のスニペットです。

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

2 に答える 2

2

API Gatewayバイナリ レスポンスの送信をサポートしていません。Lambda別の方法として、バイナリ データを格納し、ヘッダーを介してオブジェクトの場所にリダイレクトすることもできますS3HTTPS3Location

于 2016-09-22T20:01:42.767 に答える
1

API Gateway はバイナリ データをネイティブにサポートしていません。一部のお客様は、JSON 応答を含め、Lambda でデータを base64 エンコードし、応答マッピング テンプレートを使用してデータをデコードし、クライアントに応答することに成功しています。

于 2016-09-22T00:40:33.880 に答える