首页 文章

AWS API Gateway base64Decode产生乱码二进制文件?

提问于
浏览
11

我正在尝试从AWS API Gateway方法返回1px gif .

由于现在支持二进制数据,我使用以下“集成响应”映射返回image / gif:

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

但是,当我在Chrome中查看此内容时,我会看到返回以下二进制文件:

enter image description here

代替:

enter image description here

任何人都可以帮助我理解为什么这是乱码和错误的长度?或者我能做些什么来返回正确的二进制文件?还有其他一些我总是可以返回这个1px gif而不使用base64Decode函数?

非常感谢,这给我带来了很大的痛苦!

EDIT

这个变得陌生 . 看起来问题不在于base64Decode,而在于二进制的一般处理 . 我在this blog postStack Overflow question之后添加了一个Lambda后端(之前我使用的是Firehose) . 我根据documentation page将图像设置为binaryMediaType .

这让我可以通过Gateway API从Lambda传递以下图像/ 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 });

};

但是,以下代表图像/ png或图像/ 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 });

};

这似乎与another Stack Overflow question是同一个问题,但我希望这可以通过Gateway API二进制支持来解决 . 不幸的是,image / bmp并不是透明的......

万一它可以帮助任何人,this has been a good tool用于在base64和hex之间进行转换 .

3 回答

  • 0

    看起来这是以前的一个已知问题: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

    这是我的Lambda函数,它将base64编码的PNG作为字符串返回:https://gist.github.com/davemaple/73ce3c2c69d5310331395a0210069263

    我更新了方法响应如下:
    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"}]'
    

    我希望这有帮助 .

  • 8

    对于其他任何有这个问题的人:我还试图通过API网关 proxy integrationlambda 检索二进制图像,但是后来我注意到它在Lambda控制台的二进制支持部分中说:

    API Gateway将查看Content-Type和Accept HTTP标头,以决定如何处理正文 .

    所以我在请求 Headers 中添加了 Accept: image/png 并且它有效 . 哦快乐,快乐!无需手动将内容处理更改为CONVERT_TO_BINARY或使用cli进行清理 . 当然,这排除了直接使用 <img src= (不能设置 Headers ) .

    因此,为了通过代理集成从lambda获取API网关上的二进制文件:

    • 列出lambda控制台中所有支持的二进制内容类型(并部署)

    • 请求Accept标头必须包含lambda表达式返回的Content-Type标头

    • 返回的正文必须是base64编码的

    • 结果对象还必须将 isBase64Encoded 属性设置为 true

    码:

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

    查看this answer . 它帮助我通过GET请求公开PDF文件,无需任何额外的 Headers .

相关问题