当前位置: 首页 > 知识库问答 >
问题:

如何通过 Boto3 将图像字节发送到 Lambda?

陆俭
2023-03-14

可以使用Boto3通过Lambda发送图像字节吗?字节将被发送到Lambda函数,然后该函数将图像转发到Rekognition。我试过这个,但不起作用:

with open(image_name) as image_source:
    image_bytes = image_source.read()

context = base64.b64encode(b'{"custom":{ \
    "image_name":"'+imagename+'", \
    "image_bytes" : "'+image_bytes+'"}}').decode('utf-8')

response = lambda_fn.invoke(
    ClientContext=context,
    FunctionName='recognize-face-in-image'
)

这是 Lambda 函数代码:

import boto3  
import base64  
import json  

def lambda_handler(event, context):
 print("Lambda triggered...")
 rek = boto3.client('rekognition')

 context_dict = context.client_context.custom
 image_bytes = context_dict["image_bytes"]
 rekresp = rek.detect_faces(Image={'Bytes': image_bytes},Attributes=['ALL'])
 if not rekresp['FaceDetails']:
     print "No face"
 else:
     print "Got face"  

当我运行它时,这是Cloudwatch中显示的Lambda函数错误:

调用 DetectFaces 操作时发生错误(验证异常):检测到 1 个验证错误:在“image.bytes”处的值“java.nio.HeapByteBuffer[pos=0 lim=0 cap=0]”未能满足约束: 成员的长度必须大于或等于 1: 客户端错误回溯(最近一次调用): 文件 “/var/task/lambda_function.py”,第 17 行,lambda_handler rekresp = rek.detect_faces(Image={'Bytes': image_bytes},Attributes=['ALL']) 文件 “/var/runtime/botocore/client.py”,第 314 行,_api_call返回 self._make_api_call(operation_name, kwargs) 文件 “/var/runtime/botocore/client.py”,第 612 行,_make_api_call引发error_class(parsed_response,operation_name) 客户端错误:调用 DetectFaces 操作时发生错误(验证异常):检测到 1 个验证错误:值“java.nio.HeapByteBuffer[pos=0 lim=0 cap=0]”在“image.bytes”未能满足约束: 成员的长度必须大于或等于 1

共有2个答案

华良平
2023-03-14

从Lambda.invoke()不发送客户端上下文·问题#1388·aws/aws-sdk-js:

var ctx = {
    custom: { foo: 'bar' },
    client: { snap: ['crackle', 'pop']},
    env: { fizz: 'buzz' },
};
la.invoke({
    FunctionName: 'contextPrinter',
    ClientContext: AWS.util.base64.encode(JSON.stringify(ctx)),
    InvocationType: 'RequestResponse',
    Payload: JSON.stringify({ baz: 'quux' })
}, function (err, data) { return console.log(err, data); });

虽然这是JavaScript而不是Python,但它应该给出了如何编码< code>context的一般概念。

米裕
2023-03-14

< code>ClientContext不是向Lambda函数发送批量数据的正确方法。相反,应该使用< code>Payload。

此外,图像将是二进制数据,需要在< code>rb模式下打开,并且不能在JSON中携带。

import base64
import json
import boto3

with open(image_name, 'rb') as image_source:
    image_bytes = image_source.read()

response = boto3.client('lambda').invoke(
    FunctionName='recognize-face-in-image',
    Payload=json.dumps({
        'image_name': image_name,
        'image_bytes': base64.b85encode(image_bytes).decode('utf-8'),
    }),
)

Lambda函数应该是这样的:

import base64

def handler(event, context):
    image_bytes = base64.b85decode(event['image_bytes'])
    ...
 类似资料:
  • 问题内容: 我正在制作一个应用程序,用于将图像从Android设备发送到在PC上运行的Java应用程序。客户端(android)上的图片是,我将其转换为,以便通过蓝牙发送到服务器。 请注意,位图来自已压缩的文件,因此我不需要再次对其进行压缩。 我在服务器(Java)上使用以下代码: 客户端没有错误。但是我在服务器端(Java应用程序)遇到此异常: java.lang.IllegalArgument

  • 问题内容: 我有一个生成图像的Java Applet。最终,我想将图像数据插入数据库中,因此我想将图像数据临时存储在包含小程序的页面上的表单字段中。我希望在不将图像文件存储在客户端计算机上的情况下执行此操作。 所有这些都来自签名板。这是一些应该从sigObj对象中存储的矢量数据生成位图图像的代码: image变量是BufferedImage对象。另外,如果我只是将图像变量发送回我的JavaScri

  • 问题内容: 我正在尝试使用HttpUrlConnection将图像发送到服务器,因为它是Google推荐的。我决定将图像转换为Base64字符串,然后将其发送到服务器,然后将其解码为.jpg文件。但是这种方法仅适用于小尺寸缩略图,而我无法发送全尺寸图像。 这是android客户端代码: Node.js服务器代码: 由于BufferedWriter的大小限制,我无法对完整尺寸的图像使用相同的方法-b

  • 我在节点上运行了一个https服务器。js服务于用python编写的各种客户端应用程序的请求,我希望能够在客户端之间实现对等通信。为了实现这一点,我正在跟踪服务器上的“在线”客户端,然后这些客户端会发送必要的数据,以便对等方可以在彼此之间进行通信。 我的目标: 客户端应用程序打开三个套接字(一个用于接收来自其他客户端的消息,一个用于向其他客户端发送消息,另一个用于接收来自服务器的消息-我们称之为通

  • 问题内容: 我想发送一个用JavaScript构造的数组,其中包含多个select的选定值。有没有一种方法可以使用ajax将此数组发送到php脚本? 问题答案: 您可以使用XML或JSON发回到服务器。您的javascript将必须构造该帖子,在XML的情况下,则需要您在javascript中创建它。JSON不仅轻巧,而且更易于在javascript中制作。签出JSON- PHP 来解析JSON。

  • 我正试图用Qt5.7用c编写一个应用程序,基本上它应该是一个websocket服务器,使用qwebsocket,能够将opencv制作的图像发送到HTML客户端。我要做的是在base64中对图像进行编码,然后在客户端将编码后的字符串放入图像标记的src中。只是为了测试,我可以正确地发送/接收文本消息,因此websocket架构可以正常工作,但是我在图像方面遇到了一些问题。这是我的代码片段: 服务器

  • 问题内容: 我想使用JavaScript中的方法发送一些变量和一个字符串。 我从数据库中获取字符串,然后将其发送到PHP页面。我正在使用一个对象。 问题在于该字符串多次包含该字符,PHP中的数组将其视为多个键。 我试着更换与与功能,但它似乎并没有做任何事情。 有人可以帮忙吗? javascript代码和字符串如下所示: 字符串是: 问题答案: 您可以使用encodeURIComponent()。

  • 问题内容: 我真的很困惑如何通过套接字发送图像数据类型。请帮我。我已经搜寻了如何将Image数据类型转换为char [],但结果为0。 问题答案: 您可以使用以下方法将其转换为(source): 然后,您可以使用ImageIO.write()方法写入结果。