web-dev-qa-db-ja.com

AWS API Gateway base64Decodeは文字化けしたバイナリを生成しますか?

AWS API Gatewayメソッドから1px gifを返そうとしています。

バイナリデータがサポートされるようになったため、次の 'Integration Response'マッピングを使用してimage/gifを返します。

$util.base64Decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")

ただし、Chromeでこれを見ると、次のバイナリが返されています。

enter image description here

の代わりに:

enter image description here

なぜこれが文字化けし、間違った長さであるかを理解してくれる人はいますか?または、正しいバイナリを返すために何ができますか? 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の間の変換のため。

15
rjmurt

これは以前に既知の問題であったようです: https://forums.aws.Amazon.com/thread.jspa?messageID=668306&#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

メソッドの応答を次のように更新しました: api gateway binary method response

統合応答を更新して、ハードコードされたimage/pngヘッダーを含めるようにしました: api gateway binary integration response

最後のステップは注意が必要でした。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"}]'

これがお役に立てば幸いです。

10
Dave Maple

これに問題がある他の人へ: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経由でバイナリファイルを取得するには:

  • サポートされているすべてのバイナリコンテンツタイプをラムダコンソールに一覧表示(および展開)
  • 要求Acceptヘッダーには、ラムダ式から返されたContent-Typeヘッダーが含まれている必要があります
  • 返される本文はbase64でエンコードする必要があります
  • 結果オブジェクトには、isBase64Encodedプロパティがtrueに設定されている必要もあります

コード:

callback(null, {
    statusCode: 200,
    headers: { 'Content-Type': 'image/png' },
    body: buffer.toString('base64'),
    isBase64Encoded: true
}
18
M.R.

この回答 をご覧ください。 PDFヘッダーを追加せずにGETリクエストでダウンロードするファイルを公開するのに役立ちました。

1
MEGApixel23