概要
AWS Lambda プロキシ統合からバイナリメディアを返すには、base64 で Lambda 関数からのレスポンスをエンコードします。
LambdaおよびLambdaプロキシ統合利用時(今回はAPI Gateway)は上記のように、base64にエンコードしておく必要がある。
このようなやり取りの作法にもとづきながらクライアント側から横断的に纏めた型変換特化ドキュメントを、半分自分用に掲載する。
環境
クライアント側nodejs:v14.15.5
Lambda:Node.js 12.x
本ドキュメント想定対象
- 自分。「こういう変換すれば上手くいきました」と他の人に見せたりコードを再確認する時。
- Lambdaプロキシ統合でバイナリファイルを取り扱おうとして躓いている人
- AWS構築時に「他の人のデータ型のやり取り成功例を見たい」と思ってる方
各連係における、バイナリファイルの型表
ローカル⇔クライアント | クライアント⇔API Gateway | API Gateway⇔Lambda | Lambda⇔S3(AWS側ストレージ) |
---|---|---|---|
File(blob)⇔File(blob) or base64(String) | base64(String)⇔base64(String) | base64(String)⇔base64(String) | base64(String) or File⇔File |
上記のようにAPI叩いたり返す時に文字列でやり取りすることで、他の引数と同じようなやり取りが可能となり上手くいった。
微妙に躓いた各型変換
##File(アップロードされたファイル)→base64(String)、ブラウザ上の動作を想定。
メモ: blob の result は、先に Base64 でエンコードされたデータの前にある Data-URL の宣言を削除しておかないと、直接 Base64 としてデコードすることができません。 Base64 でエンコードされた文字列のみを受け取る場合は、先に結果から data:/;base64, を削除しておく必要があります。
// "data:*/*;base64,base64文字列" → "base64文字列"
var base64result = this.contents.split(",")[1];
##base64(String)→Buffer、node.js内部の動作を想定。
var bufContents = Buffer.from(contents, "base64");
##Buffer→base64(String)、node.js内部の動作を想定。
buf.toString('base64')
##base64(String)→File(blob)、ブラウザ上の動作を想定。
この方のコードを参考にさせていただきました。多謝。
//Base64とMIMEコンテンツタイプからBlobオブジェクトを作成する。
function toBlob(base64, mime_ctype) {
var bin = atob(base64.replace(/^.*,/, ""));
var buffer = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) {
buffer[i] = bin.charCodeAt(i);
}
// Blobを作成
try {
var blob = new Blob([buffer.buffer], {
type: mime_ctype
});
} catch (e) {
return false;
}
return blob;
}