AWS API Gatewayメソッドから1px gifを返そうとしています。
バイナリデータがサポートされるようになったため、次の 'Integration Response'マッピングを使用してimage/gifを返します。
$util.base64Decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")
ただし、Chromeでこれを見ると、次のバイナリが返されています。
の代わりに:
なぜこれが文字化けし、間違った長さであるかを理解してくれる人はいますか?または、正しいバイナリを返すために何ができますか? base64Decode関数を使用せずにこの1px gifを常に返すことができるものが他にありますか?
事前に感謝します、これは私に多くの痛みを引き起こしています!
[〜#〜] edit [〜#〜]
これは見知らぬ人になります。問題はbase64Decodeではなく、バイナリの一般的な処理にあるようです。 Lambdaバックエンドを追加しました(以前はFirehoseを使用していました) このブログ投稿 およびこれ Stack Overflow question に続きます。このように画像をbinaryMediaTypeに設定します ドキュメントページ 。
これにより、LambdaからGateway APIを介して次のimage/bmpピクセルを渡すことができ、正常に動作します。
exports.handler = function(event, context) {
var imageHex = "\x42\x4d\x3c\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x06\x00\x00\x00\x27\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00";
context.done(null, { "body":imageHex });
};
ただし、image/pngまたはimage/gifを表す次の画像は、通過すると文字化けします。
exports.handler = function(event, context) {
//var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\xff\xff\xff\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x01\x44\x00\x3b";
//var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\xff\xff\xff\x00\x00\x00\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b";
var imageHex = "\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x21\xf9\x04\x01\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x44\x01\x00\x3b\x0a"
context.done(null, { "body":imageHex });
};
これは 別のStack Overflowの質問 と同じ問題のようですが、Gateway APIバイナリサポートで修正されることを望んでいました。残念ながら、イメージ/ bmpは透明にできないため、私のユースケースでは機能しません...
それが誰かを助ける場合、 これは良いツールでした base64とhexの間の変換のため。
これは以前に既知の問題であったようです: https://forums.aws.Amazon.com/thread.jspa?messageID=668306򣊒
しかし、バイナリデータのサポートが追加されたので、今では可能になっているはずです。 http://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html
これが必要なビットのように見えます:「IntegrationResponseリソースのcontentHandlingプロパティをCONVERT_TO_BINARYに設定して、Base64エンコードから変換された応答ペイロードを取得しますバイナリblobへの文字列」。その場合、base64Decode()
関数は必要ありません。
これが機能するかどうかを確認するために、現在テスト中です。
[〜#〜] edit [〜#〜]:ようやくこれを機能させることができました。ここでバイナリ画像を見ることができます: https://chtskiuz10.execute-api.us-east-1.amazonaws.com/prod/rest/image
以下は、base64でエンコードされたPNGを文字列として返すLambda関数です。 https://Gist.github.com/davemaple/73ce3c2c69d5310331395a021006926
統合応答を更新して、ハードコードされたimage/pngヘッダーを含めるようにしました:
最後のステップは注意が必要でした。contentHandling
プロパティを「CONVERT_TO_BINARY」に設定します。 AWSコンソールでの操作方法がわかりませんでした。これを行うには、CLI APIを使用する必要がありました。
aws apigateway update-integration-response \
--profile davemaple \
--rest-api-id chtskiuzxx \
--resource-id ki1lxx \
--http-method GET \
--status-code 200 \
--patch-operations '[{"op" : "replace", "path" : "/contentHandling", "value" : "CONVERT_TO_BINARY"}]'
これがお役に立てば幸いです。
これに問題がある他の人へ:API Gateway proxy integration from lambdaからバイナリ画像を取得しようとして頭を壁にぶつけていましたが、その後に気付きましたLambda ConsoleのBinary Supportセクションにあります:
API Gatewayは、Content-TypeおよびAccept HTTPヘッダーを見て、本文の処理方法を決定します。
そこで、リクエストヘッダーにAccept: image/png
を追加し、機能しました。ああ、喜びと喜び!コンテンツ処理を手動でCONVERT_TO_BINARYに変更したり、cliをいじったりする必要はありません。もちろん、これは、たとえば<img src=
を直接使用することを除外します(ヘッダーを設定できません)。
したがって、プロキシ統合を使用してラムダからAPI Gateway経由でバイナリファイルを取得するには:
isBase64Encoded
プロパティがtrue
に設定されている必要もありますコード:
callback(null, {
statusCode: 200,
headers: { 'Content-Type': 'image/png' },
body: buffer.toString('base64'),
isBase64Encoded: true
}
この回答 をご覧ください。 PDFヘッダーを追加せずにGETリクエストでダウンロードするファイルを公開するのに役立ちました。