微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – 从AWS Lambda函数中的S3获取对象并发送到Api Gateway

我想从一个桶中获取一个.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);
    }
    ]
);

响应头的内容长度为:85948,这似乎不对,因为原始文件只有36kb.谁知道我做错了什么?

解决方法

您可以实现获取图像< - > API网关< - > Lambda< - > S3轻松集成.

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

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

>集成请求

>取消选中:使用Lambda Proxy集成

>方法响应

>添加回复 – > HTTP状态:200
>添加标题内容类型

>整合响应 – >标题映射 – >响应标头 – >内容类型

>映射值:’image / jpeg'(单引号)

从命令行,运行以下命令强制将字符串转换为二进制.
首先,从API网关检索rest-api-id和resource-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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐