首页 > 解决方案 > 通过 AWS API Gateway 后 JPG 损坏

问题描述

我目前正在将 Web 服务移动到 AWS API 网关后面,并且在上传 jpeg 时遇到了麻烦。

此时的网关只是一个代理。有一个 ANY 资源只是将所有内容代理到具有相同路径的服务(现在它主要只是为了在服务移动域时在旧 url 上提供 https 支持)。代理的内容处理设置为直通,因此不应重新编码任何内容。

但是当我现在在表单数据请求中上传 jpg 时,上传的图像在那里,但无法打开。尝试打开它们时出现错误: Not a JPEG file: starts with 0xef 0xbf

现在我现在你在想什么,你想告诉我我的 jpg 实际上是一个 png。相信我,它不是。提供这些图像的管道多年来一直可靠运行,我可以在上传 jpg 之前打开它们,如果我将它们重命名为 .png,我也无法打开服务器上的文件。不知何故,API 网关似乎破坏了通过的表单数据。

所以我在通过网关之前和之后对图像进行了一些Hexing。内容是相同的,除了文件中的第一个字节。在图像通过网关之前,文件的开头如下所示:

FF D8 FF E1 FF FE

上传后,替换为:

EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD

否则文件是相同的。为什么网关会这样做,我该如何阻止它?(根据网关日志,传入请求的内容类型标头image/jpeg,所以也不应该有问题......)

标签: amazon-web-servicesaws-api-gateway

解决方案


根据评论。

该问题是由于未在 API 网关中设置二进制媒体类型引起的:

在 API Gateway 中,API 请求和响应具有文本或二进制负载。文本负载是 UTF-8 编码的 JSON 字符串。二进制有效负载不是文本有效负载。例如,二进制有效负载可以是JPEG 文件、GZip 文件或 XML 文件。

对于AWS Lambda 代理集成

您必须对函数的响应进行 base64 编码。您还必须为您的 API 配置 binaryMediaTypes


推荐阅读