Return 来自 aws lambda 函数的图像

Return image from aws lambda function

大家好,我正在尝试 return 图像作为来自 aws lambda/api-gateway 的 http 响应。出于某种原因,我的回复以一张空图片结束。 这是我在 aws lambda 上的内容:

"use strict";

var handler = function (event, context, callback) {
const base64Image = "iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAAAAACupDjxAAAFPklEQVR42u2ZvWsqTRSH7//0g0UEYQmIIIIEBAtBEAIWFhaBgBCwsBBuEQtBEEHSWKSwCFhYSJoUKQIXLgRsLERSCBYSJFgsct7CndmP2RGi7np5OdtlTtw8mY/nnDn+on/8+cWADMiADMiADMiADMiADMiADMiADMiADMiADMiADMiADMiADMiADMiADMiADMiADMiA/0vAm6tMrliu1hoPncdBv9tq3FVKuXTSTC1pmzaT2WK11mj1Br12s35bKeWzydQnWdmYmc6X7xrtbrfdrFUKaTNWIJoY8atssVp/6PQ6rXq1mDFjudMBU9A8f2hjBAbeaBEwmifqqaPXpwN+NPMBHGa59U30Uksrf/G2vaHd433BMxovtaZEn+27jHvUKDzMz7IHN5NrL0V6aInYvOIO3M3kh2a3cjQzkr++G8t/yehszndIrEHchZFZu2NDF597fCfQ25Z7eBqzl3x+3lP87iL86w21ZeDF+5H9YNf3pvp+EVbn1syzxEjsfNObE5Gxd2cAAG79LxrYJ+nsHpR7SlHDm4j89gwvASD55f/tIQDUQxD1IiaOpOUPid12tXWPvqqrLnZEfBlGJvktJmqiqEhERu7RGoBqgPmVqT4X4KfwYYV0U5h3ja0MwFCP6toAjM9wcnFNTJTyZ99F5NUZawXP1ABALaRi4a/AaCqhoh0pOhMYBxJr9SXXqqfOV82I/JVQcsBEsL+7d2xHfcUbgEJo5ZZ04cAf2YlkWBaOiQHmJlhWo9AAt6aNkd0F2g0APvY/NwD01TcsDSBphVewtgIOg82etCP7zLEwgNSWAiXYCbGiPmCavmCfERHdA3gKKDqSgLEKEZCqWtN8JezIPRHNDCATsJJjOx4e4JveNA+izvvUH4WSs0nDujRda02zNCT7FEBup3546jFlOIADrWnsQg+IrSpBCds+2qOQATcJrWlmgr2skfEm/kPHHHUvbmpN45wgTUE6CKivzw8o50k1zR+H70azf3/mmOM6C2WtaWTJAPzRGOCewgec6E0jQ2XdneEjAkArrTWNLBnSVnAaLlIEgE5SU00zDKz9909HufaFBbiOaU0jSwZV01YSSFmRANK93jR97cVqDKAXUX/wQ28aGSoEXOZiq4gAHZ0oprnTmXr2k9v6yYAjnWlmjqrLahqeRga4vdKY5haaFtMmAZQoMkCnoTVQdqBc/qo/DY8jBJS1n9c0FcBYVDy1v/3kjnLM8YDOWr76LvZNp8tQ83YeehQl4HuQacpAfOWccWPhPtyxdaSAlFNN8w6g7S4ZGu4+Up2iBXxSTXMDmF9EtMvK2t+VhqcRA34n/KZ5A/DoLRke7DSc0lSwYQI67cyBk17sXoIsGezu1lhzhwoXcA6vaV4ADP0lQ1esfdqKHFB2VW3T5IFry99lML/t/Nen6AFfPKaZeJax5V7/JhBfXwBwl3GZZpfzVFgy06Qs2iSOdsxpgPTo+npk5CuwRJcBQ3o63jEnAq7j0jRW1ldfybora+WOd8yJgM40DZ6VG6XsMjROcMypgFM5TRnfN52eLsPxjjkVkEquL6fn+lifLgU4diAaWgud4JiTAa2khFjq650GXQyQOgKipcaegyrrqAFXtpDNgFW0UgcaSVEBintw/4DIXy4KuLdJchsU25gAkN5dFJDyCP7KRl5OH+mygEMAWY2IVzEg/nVhwK154EbeONEx5wCk7oFSYGHG5xcHpOWBU/C9ocsDhvswIAMyIAMyIAMyIAMyIAMyIAMyIAMyIAMyIAMyIAMyIAMyIAMy4D/6/AdhR419vDNESgAAAABJRU5ErkJggg==";
const image = Buffer.from(base64Image, 'base64');

    var response = {
        statusCode: 200,
        headers: {
            "Content-Type": "image/jpeg"
        },
        isBase64Encoded: true,
        body: image.toString('base64')
    };
    callback(null, response);
};
exports.handler = handler;

我还设置了二进制媒体类型 至 / 关于如何让它工作的任何想法? 这也是我的结果

一个解决方案(我使用)是返回图像的 base64 字符串,然后在 API 网关上将 base64 字符串转换为二进制。

aws apigateway update-integration-response \ 
 — rest-api-id <xxx> \
 — resource-id <xxx> \ 
 — http-method GET \ 
 — status-code 200 \ 
 — patch-operations ‘[{“op” : “replace”, “path” : “/contentHandling”, “value” : “CONVERT_TO_BINARY”}]’

稍后,您必须在 API 网关的 Settings 选项下添加 */* 作为二进制媒体类型。 来自 cli:

aws apigateway update-rest-api — rest-api-id XXX — patch-operations ‘[{“op” : “replace”, “path” : “/binaryMediaTypes/*~1*”, “value” : “*~1*”}]’

注意:您应该重新部署 api 网关

如果您在 API 网关上使用 Lambda 代理集成,请尝试以下步骤。

  1. 在 AWS API 网关下 > 模型 > 使用 ImageJPEG 和 {} 创建模型名称作为模型架构。

  2. 在 API 网关 > 资源 > 您的 GET 端点 > 单击 'Method Response'。 为 200 创建新的响应状态。 在 'Response Headers for 200' 下添加新的 header 'Content-Type'。 添加 'Response Body for 200' 作为 'image/jpeg' 和 select ImageJPEG 作为您之前创建的模式。

  3. 在 API 网关 > 设置 > 'Binary Media Types' 下。

添加 'image/jpeg' 和 'text/html' 作为支持的二进制类型。如果您直接通过浏览器访问,则需要 'text/html'。 (否则,如果您将 'Accept' header 作为 'image/jpeg' 发送,它应该可以工作)。如果这不起作用,请添加 */* 作为二进制媒体类型以允许所有类型。