我在s3上的水桶被命名为' python'它的子文件夹是老板' 。所以我想在lambda函数中获取文件夹boss的所有图像。目前我是硬编码值,但将图像放在root中而不是在子文件夹中。
bucket="python"
key="20180530105812.jpeg"
然后我想逐个为所有图像调用此函数
def lambda_handler(event, context):
# Get the object from the event
bucket="ais-django"
key="20180530105812.jpeg"
try:
# Calls Amazon Rekognition IndexFaces API to detect faces in S3 object
# to index faces into specified collection
response = index_faces(bucket, key)
# Commit faceId and full name object metadata to DynamoDB
答案 0 :(得分:1)
在s3客户端上使用list_object操作。
bucket="python"
client=boto3.client('s3')
response = client.list_objects(
Bucket=bucket,
Prefix='boss'
)
numberofobjects=len(response['Contents'])
for x in range(1, numberofobjects):
try:
response2=index_faces(bucket, response['Contents'][x]['Key'])
答案 1 :(得分:1)
您可以在存储桶中过滤该文件夹。举个例子:
#import boto3
s3 = boto3.resource('s3')
python_bucket = s3.Bucket('python')
for images in python_bucket.objects.filter(Prefix="boss/"):
print images.key
更新:
根据您最近的编辑,您可以遍历存储桶/文件夹并运行脚本。这是一个更完整的代码段,应该适用于您的Lambda函数:
import boto3
def lambda_handler(event, context):
s3 = boto3.resource('s3')
images = ""
python_bucket = s3.Bucket('python')
#Here, you're going through each image in your bucket/folder.
for image in python_bucket.objects.filter(Prefix="boss/"):
images += image.key
return images
答案 2 :(得分:1)
这是你可以做的最好的事情,将s3事件通知添加为lambda函数的触发器,并将其配置为" boss /" 的对象前缀在你的情况下
这里的前缀是" boss /"
然后在您的代码中更改您的存储桶并键入:
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))
借助此功能,只要将对象上传到您的 存储桶 / boss / 路径,您的代码就会自动获取它并运行它来代码处理
这样你的lambda将不需要任何硬编码的桶和密钥字符串,并且会自动运行你的子文件夹路径中的图像上传。如果你只想处理图像,添加过滤器模式为 .jpg,.jpeg,.png等