web-dev-qa-db-ja.com

AWS LambdaがPDFファイルを返すのに失敗する

serverless を使用してラムダ関数を作成しました。この関数は、GET要求でAPI Gatewayを介して起動され、バッファーからpdfファイルを返す必要があります。 html-pdf を使用してバッファーを作成し、次のコマンドでPDFファイルを返そうとしています。

  let response = {
    statusCode: 200,
    headers: {'Content-type' : 'application/pdf'},
    body: buffer.toString('base64'),
    isBase64Encoded : true,
  };
  return callback(null, response);

しかし、ブラウザはpdfのロードに失敗しているだけなので、pdfファイルを直接ブラウザに返す方法が正確にはわかりません。その解決策が見つかりませんでした。

9
sami_analyst

まあ、私は答えを見つけました。応答オブジェクトの設定は問題ありません。これをブラウザーで機能させるには、API Gatewayの設定を手動で変更する必要がありました。 API Gatewayコンソールのバイナリ設定で、バイナリメディアタイプに「*/*」を追加しました

APIゲートウェイ

  1. コンソールにログインするだけです
  2. あなたのAPIを選択してください
  3. ドロップダウンでバイナリサポートをクリックします
  4. バイナリメディアタイプを編集し、「*/*」を追加します

フロントエンド

新しいタブでAPI URLを開きます(target = "_ blank")。おそらく、ブラウザーはエンコードされたbase 64応答を処理しています。クロムの場合、ブラウザーはちょうど私がやりたいように新しいタブでpdfを開きます。

15
sami_analyst

これに数時間を費やした後、_Content handling_を_Convert to binary_(CONVERT_TO_BINARY)に設定すると、応答全体がbase64でなければならないことがわかりました。そうしないと、エラーが発生します:_Unable to base64 decode the body_.

したがって、私の応答は次のようになります。

callback(null, buffer.toString('base64'));

統合レスポンス:

enter image description here

メソッドの応答:

enter image description here

バイナリメディアタイプ:

enter image description here

9
teocomi

巨大なPDFがある場合、Lambdaがそれを返すのに長い時間がかかり、Lambdaでは100ミリ秒ごとに請求されます。

最初にS3に保存してから、LambdaがダウンロードのためにクライアントにS3 URLを返すようにします。

6
dashmug

上記のソリューションは、特定のコンテンツタイプ専用です。これ以上コンテンツタイプはできません。複数のコンテンツタイプの問題を解決するには、以下の2ステップのみに従ってください。

  1. Use Lambda Proxy integrationのチェックボックスをクリックします

APIゲートウェイ-> API->メソッド->統合リクエスト

enter image description here

enter image description here

  1. としてあなたの応答を作成します

    let response = {

          statusCode: 200,
          headers: {
            'Content-type': 'application/pdf',//you can change any content type
            'content-disposition': 'attachment; filename=test.pdf' // key of success
          },
          body: buffer.toString('base64'),
          isBase64Encoded: true
        };
        return response;
    

注*-安全ではありません

0
Prashant Tapase