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ファイルを直接ブラウザに返す方法が正確にはわかりません。その解決策が見つかりませんでした。
まあ、私は答えを見つけました。応答オブジェクトの設定は問題ありません。これをブラウザーで機能させるには、API Gatewayの設定を手動で変更する必要がありました。 API Gatewayコンソールのバイナリ設定で、バイナリメディアタイプに「*/*」を追加しました
APIゲートウェイ
フロントエンド
新しいタブでAPI URLを開きます(target = "_ blank")。おそらく、ブラウザーはエンコードされたbase 64応答を処理しています。クロムの場合、ブラウザーはちょうど私がやりたいように新しいタブでpdfを開きます。
巨大なPDFがある場合、Lambdaがそれを返すのに長い時間がかかり、Lambdaでは100ミリ秒ごとに請求されます。
最初にS3に保存してから、LambdaがダウンロードのためにクライアントにS3 URLを返すようにします。
上記のソリューションは、特定のコンテンツタイプ専用です。これ以上コンテンツタイプはできません。複数のコンテンツタイプの問題を解決するには、以下の2ステップのみに従ってください。
APIゲートウェイ-> API->メソッド->統合リクエスト
としてあなたの応答を作成します
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;
注*-安全ではありません