这是我的第三节:
img = request.FILES.get('image')
filename = random_string()
"""if filename exists in my s3 bucket:
create another random_string"""
session = boto3.Session(
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)
s3 = session.resource('s3')
s3.Bucket('my-bucket').put_object(Key='media/%s' % img.name, Body=img)
基本上,当我通过AJAX上传文件时,根据上面的代码,我生成一个随机文件名。但是,在为新上传的图像使用此文件名之前,我想检查它是否存在,以防止重叠。如果确实存在,则尝试另一个随机字符串。
我该怎么做?
答案 0 :(得分:1)
你的随机功能有多好?如果可能,我建议使用UUID generator来提出文件名,并假设没有碰撞(或假设最终发生碰撞,并按照后续步骤进行操作。)
关于如何判断一个密钥是否已经存在,我希望你可以只执行一个“获取对象”。对于给定的生成密钥。如果你得到了回报,那么那里就有一个对象,应该生成并测试一个新密钥。
请注意,此方法不是原子操作,并且会为其他位置生成密钥的窗口(假设可以执行多个并发执行)并在check和put之间放入S3存储桶。正是因为这种可能性,我才首先推荐UUID发生器。
答案 1 :(得分:0)
检查random_string()
功能。也许缓存随机字符串的结果,并确认在返回之前没有使用您要返回的字符串。