5

我正在尝试从存储桶中获取 .jpg 文件并将其发送回 api 网关。当我看到正在记录的内容时,我相信我的设置是正确的。它可以很好地从 s3 中获取文件,而 gm 是 graphicsmagick 库。不确定我是否正确使用它。

在 lambda 函数中,我这样做(很多代码来自 aws 示例):

async.waterfall([
    function download(next) {
        console.log(srcKey);
        console.log(srcBucket);
        // Download the image from S3 into a buffer.
        s3.getObject({
                Bucket: srcBucket,
                Key: srcKey
            },
            next);
        },
    function transform(response, next) {
        console.log(response);
        next(null, 'image/jpeg', gm(response.Body).quality(85));

    },

    function sendData(contentType, data, next){
        console.log(contentType);
        console.log(data);
        imageBuffer = data.sourceBuffer;
        context.succeed(imageBuffer);
    }
    ]
);

响应头有 content-length: 85948,这看起来不对,因为原始文件只有 36kb。有人知道我在做什么错吗?

4

2 回答 2

4

您可以轻松实现 Get Image <-> API Gateway <-> Lambda <-> S3 集成。

在 lambda 中,而不是 json,返回图像 ( buffer.toString('base64')) 的 base64 字符串表示,强制 API Gateway 将字符串转换为二进制并添加特定的Content-Type(因此您不需要使用它们强制您发送特定 Accept 标头的有限二进制支持)。

在 AWS 控制台中,转到 API Gateway,然后转到相关方法并更新设置:

  • 集成请求

    • 取消选中:使用 Lambda 代理集成
  • 方法响应

    • 添加响应 -> HTTP 状态:200
    • 添加标题:内容类型
  • 集成响应 -> 标头映射 -> 响应标头 -> 内容类型

    • 映射值:'image/jpeg'(单引号问题)

从命令行,运行以下命令强制将字符串转换为二进制。首先,从 API Gateway检索rest-api-idresource-id 。然后,在 CLI 中运行(将 rest-api-id 和 resource-id 替换为您自己的):

aws apigateway put-integration-response --rest-api-id <rest-api-id> --resource-id <resource-id> --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY
于 2017-01-10T12:16:41.100 回答
2

API GatewayLambda. _ API GatewaywithLambda设置为响应XML/JSON数据。在此处阅读有关原因和方式的更多信息。

尝试更改您的回调链,以便将修改后的图像上传回S3. 成功上传后,发回URI目标对象并将您的客户端重定向到它。

于 2015-08-25T21:52:21.103 回答