JPG 在通过 AWS API 网关后损坏
JPG corrupted after passing through AWS API Gateway
我目前正在将 web-service 移动到 AWS API 网关后面,我 运行 在上传 jpeg 时遇到了麻烦。
此时的网关只是一个代理。有一个 ANY 资源可以将所有内容代理到具有相同路径的服务(现在它主要只是为了在服务移动域时在旧 url 上提供 https 支持)。代理的内容处理设置为直通,所以它不应该是 re-encoding 任何东西。
但是我现在在form-data请求中上传jpg,上传的图片是有的,就是打不开。尝试打开它们时出现错误:
Not a JPEG file: starts with 0xef 0xbf
现在我知道你在想什么,你想告诉我我的jpg实际上是png。相信我,事实并非如此。传送这些图像的管道已经可靠地工作了 年 ,我可以在上传它们之前打开 jpg,而且如果我将它们重命名为 .png,我也无法打开服务器上的文件。 API 网关似乎破坏了通过的 form-data。
所以我在通过网关之前和之后对图像进行了一些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
否则文件是相同的。为什么网关会这样做,我该如何阻止它? (根据网关日志,传入请求 的 content-type header 是 image/jpeg,因此也不应该有问题。 ..)
根据评论。
问题是由于未在 API 网关中设置 Binary Media Types 引起的:
In API Gateway, the API request and response have a text or binary payload. A text payload is a UTF-8-encoded JSON string. A binary payload is anything other than a text payload. The binary payload can be, for example, a JPEG file, a GZip file, or an XML file.
对于AWS Lambda proxy integrations:
you must base64-encode your function's response. You must also configure the binaryMediaTypes for your API.
我目前正在将 web-service 移动到 AWS API 网关后面,我 运行 在上传 jpeg 时遇到了麻烦。
此时的网关只是一个代理。有一个 ANY 资源可以将所有内容代理到具有相同路径的服务(现在它主要只是为了在服务移动域时在旧 url 上提供 https 支持)。代理的内容处理设置为直通,所以它不应该是 re-encoding 任何东西。
但是我现在在form-data请求中上传jpg,上传的图片是有的,就是打不开。尝试打开它们时出现错误:
Not a JPEG file: starts with 0xef 0xbf
现在我知道你在想什么,你想告诉我我的jpg实际上是png。相信我,事实并非如此。传送这些图像的管道已经可靠地工作了 年 ,我可以在上传它们之前打开 jpg,而且如果我将它们重命名为 .png,我也无法打开服务器上的文件。 API 网关似乎破坏了通过的 form-data。
所以我在通过网关之前和之后对图像进行了一些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
否则文件是相同的。为什么网关会这样做,我该如何阻止它? (根据网关日志,传入请求 的 content-type header 是 image/jpeg,因此也不应该有问题。 ..)
根据评论。
问题是由于未在 API 网关中设置 Binary Media Types 引起的:
In API Gateway, the API request and response have a text or binary payload. A text payload is a UTF-8-encoded JSON string. A binary payload is anything other than a text payload. The binary payload can be, for example, a JPEG file, a GZip file, or an XML file.
对于AWS Lambda proxy integrations:
you must base64-encode your function's response. You must also configure the binaryMediaTypes for your API.