我正在尝试从AWS API Gateway方法返回1px gif .
由于现在支持二进制数据,我使用以下“集成响应”映射返回image / gif:
$util.base64Decode("R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")
但是,当我在Chrome中查看此内容时,我会看到返回以下二进制文件:
代替:
任何人都可以帮助我理解为什么这是乱码和错误的长度?或者我能做些什么来返回正确的二进制文件?还有其他一些我总是可以返回这个1px gif而不使用base64Decode函数?
非常感谢,这给我带来了很大的痛苦!
EDIT
这个变得陌生 . 看起来问题不在于base64Decode,而在于二进制的一般处理 . 我在this blog post和Stack 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 回答
看起来这是以前的一个已知问题:https://forums.aws.amazon.com/thread.jspa?messageID=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
我更新了方法响应如下:
我更新了集成响应以包含硬编码的image / png标头:
最后一步很棘手:将
contentHandling
属性设置为"CONVERT_TO_BINARY" . 我无法弄清楚如何在AWS控制台中执行操作 . 我必须使用CLI API来完成此任务:我希望这有帮助 .
对于其他任何有这个问题的人:我还试图通过API网关 proxy integration 从 lambda 检索二进制图像,但是后来我注意到它在Lambda控制台的二进制支持部分中说:
所以我在请求 Headers 中添加了
Accept: image/png
并且它有效 . 哦快乐,快乐!无需手动将内容处理更改为CONVERT_TO_BINARY或使用cli进行清理 . 当然,这排除了直接使用<img src=
(不能设置 Headers ) .因此,为了通过代理集成从lambda获取API网关上的二进制文件:
列出lambda控制台中所有支持的二进制内容类型(并部署)
请求Accept标头必须包含lambda表达式返回的Content-Type标头
返回的正文必须是base64编码的
结果对象还必须将
isBase64Encoded
属性设置为true
码:
查看this answer . 它帮助我通过GET请求公开PDF文件,无需任何额外的 Headers .