我无法让 python lambda 返回二进制数据.
引用:
<块引用>API Gateway 将查看 Content-Type 和 Accept HTTP 标头来决定如何处理正文.
这意味着 Content-Type 响应标头必须匹配 Accept 请求标头
解决方案:
将 API 网关中的二进制媒体类型设置为您的 mime 类型:image/jpg
在你的 HTTP 请求集中 Accept: image/jpg
在你的 HTTP 响应集中 Content-Type: image/jpg
<块引用>
<代码>{isBase64Encoded":真,状态码":200,标题":{内容类型":图像/jpg"},正文":base64.b64encode(content_bytes).decode(utf-8")}<块引用>
在新屏幕上,您必须将 Accept 标头添加到白名单.
<块引用>注意 1:如果您有多种文件类型,则必须将它们全部添加到 API 网关设置中的 Binary Media Types
注意 2:对于那些来自 serverless 并希望在部署 lambdas 时设置二进制类型的用户,请查看此帖子:为 API 网关设置二进制媒体类型
插件:- 无服务器-apigw-二进制风俗:apigw二进制:类型:- '图像/JPEG'cloudfront 的 serverless.yml 文件应包含:
资源:WebAppCloudFront 分布:类型:AWS::CloudFront::Distribution特性:分布配置:...缓存行为:...-#API 调用...转发值:...标题:- 授权- 接受I cannot get python lambda to return binary data. The node-template for thumbnail images works fine but I cannot get a python lambda to work. Below is the relevant lines from my lambda. The print("image_data " + image_64_encode) line prints a base64 encoded image to the logs.
def lambda_handler(event, context):
img_base64 = event.get('base64Image')
if img_base64 is None:
return respond(True, "No base64Image key")
img = base64.decodestring(img_base64)
name = uuid.uuid4()
path = '/tmp/{}.png'.format(name)
print("path " + path)
image_result = open(path, 'wb')
image_result.write(img)
image_result.close()
process_image(path)
image_processed_path = '/tmp/{}-processed.png'.format(name)
print("image_processed_path " + image_processed_path)
image_processed = open(image_processed_path, 'rb')
image_processed_data = image_processed.read()
image_processed.close()
image_64_encode = base64.encodestring(image_processed_data)
print("image_data " + image_64_encode)
return respond(False, image_64_encode)
def respond(err, res):
return {
'statusCode': '400' if err else '200',
'body': res,
'headers': {
'Content-Type': 'image/png',
},
'isBase64Encoded': 'true'
}
Any pointers to what I'm doing wrong?
Following all the steps above didn't work on my case, because having the binary support for content-type = */* will convert all responses to binary.
My case:
Multiple lambda functions returning json (text), just a single lambda returning a binary file. All have lambda proxy enabled.
The lambdas are in an API Gateway
The API Gateway is behind CloudFront
Hint: I have notice an important information in the API Gateway -> Settings
Quoting:
API Gateway will look at the Content-Type and Accept HTTP headers to decide how to handle the body.
This means that the Content-Type response header must match Accept request header
Solution:
Set Binary Media Types in API gateway to your mime type: image/jpg
In your HTTP request set Accept: image/jpg
In your HTTP response set Content-Type: image/jpg
{ "isBase64Encoded": True, "statusCode": 200, "headers": { "content-type": "image/jpg"}, "body": base64.b64encode(content_bytes).decode("utf-8") }
On the new screen, you have to add Accept header to Whitelist.
Note 1: If you have multiple file types, you must add them all to Binary Media Types in the API gateway settings
Note 2: For those coming from serverless and want to set the binary types when deploying your lambdas, then check this post: setting binary media types for API gateway
plugins:
- serverless-apigw-binary
custom:
apigwBinary:
types:
- 'image/jpeg'
The serverless.yml file for cloudfront should contain:
resources:
WebAppCloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
...
CacheBehaviors:
...
-
#API calls
...
ForwardedValues:
...
Headers:
- Authorization
- Accept
这篇关于如何在 Python 中从 AWS 中的 lambda 函数返回二进制数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
如何在python中的感兴趣区域周围绘制一个矩形How to draw a rectangle around a region of interest in python(如何在python中的感兴趣区域周围绘制一个矩形)
如何使用 OpenCV 检测和跟踪人员?How can I detect and track people using OpenCV?(如何使用 OpenCV 检测和跟踪人员?)
如何在图像的多个矩形边界框中应用阈值?How to apply threshold within multiple rectangular bounding boxes in an image?(如何在图像的多个矩形边界框中应用阈值?)
如何下载 Coco Dataset 的特定部分?How can I download a specific part of Coco Dataset?(如何下载 Coco Dataset 的特定部分?)
根据文本方向检测图像方向角度Detect image orientation angle based on text direction(根据文本方向检测图像方向角度)
使用 Opencv 检测图像中矩形的中心和角度Detect centre and angle of rectangles in an image using Opencv(使用 Opencv 检测图像中矩形的中心和角度)