如何使用Python和Chalice库修改/替换S3图像?

时间:2019-01-25 15:57:58

标签: python amazon-s3 aws-lambda chalice

我正在编写一个lambda函数,每次用户将图像上传到S3时都会触发该函数。该功能的主要目的是压缩图像,并可能在过程中将其重命名。为此,功能是获取新上传的图像,对其进行压缩,上传新压缩的图像并删除原始文件:

@app.on_s3_event(bucket=settings.BUCKET_NAME, events=['s3:ObjectCreated:*'])
def compress(event):           
    # download the resource
    s3.Bucket(settings.BUCKET_NAME).download_file(key, local_file_path)

    # compress the image
    ...

    # rename the file, if necessary (change extension, etc.)
    ...

    # upload the new image
    s3.Object(settings.BUCKET_NAME, output_path).put(Body=open(compressed_path, 'rb'))    

    # remove original image
    s3.Object(settings.BUCKET_NAME, event.key).delete()

因此,如果我将名为sample.png的图像上传到S3,它将被压缩并重命名为sample.jpg;并且sample.png之后将被删除。

但是,问题是该解决方案将导致无限递归。原因是上载压缩图像将再次调用lambda函数,从而再次导致下载,从而压缩已压缩的图像,从而再次上载它。广告无限。

我的一个朋友提出了两种可能的解决方案:通过将压缩图像的名称存储在单独的S3存储桶文件中的某个位置来缓存压缩图像的名称,并防止缓存的文件名被多次上传;并修改压缩图像的exif / metada ,以便lambda可以知道哪些文件已经被压缩,表明该功能不应该继续进行,这将防止再次发生压缩。

第一个想法是,当从理论上讲至少将多个文件同时上传到服务器时,容易出现问题。第二个想法可能需要第三方库,例如piexif,但我正在考虑这个想法。

您是否有更好的方法来解决此问题?还是我首先要做压缩操作(除了递归上载和下载之外)?我的意思是,也许我可以压缩S3图像而无需执行download-compress-upload-delete例程。

1 个答案:

答案 0 :(得分:0)

嘿,因为您正在将其转换为另一种格式,所以如果您为上传的文件格式调用 lambda 函数会更容易,从而防止不必要的无限循环。

假设图片以 .jpeg 格式上传,您将其压缩并转换为 .png。现在,由于新更新的图像是 .png 格式,您的 lambda 函数将不会被触发。