我正在编写一个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例程。
答案 0 :(得分:0)
嘿,因为您正在将其转换为另一种格式,所以如果您为上传的文件格式调用 lambda 函数会更容易,从而防止不必要的无限循环。
假设图片以 .jpeg 格式上传,您将其压缩并转换为 .png。现在,由于新更新的图像是 .png 格式,您的 lambda 函数将不会被触发。