【问题标题】:How to search my bucket to see if a certain file exists如何搜索我的存储桶以查看某个文件是否存在
【发布时间】:2018-03-18 14:19:39
【问题描述】:

这是我的 s3 会话:

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 上传文件时,根据上面的代码,我会生成一个随机文件名。但是,在将这个文件名用于新上传的图像之前,我想检查它是否不存在,以防止重叠。如果确实存在,则尝试另一个随机字符串。

我该怎么做?

【问题讨论】:

    标签: python django amazon-web-services amazon-s3


    【解决方案1】:

    你的随机函数有多好?如果可能的话,我建议使用UUID generator 来提供文件名,并假设没有冲突(或假设最终发生冲突,然后执行后续步骤)。

    关于如何判断密钥是否已经存在,我希望您可以为给定的生成密钥执行“获取对象”。如果你得到了一些东西,那么那里已经有一个对象,应该生成一个新的密钥并进行测试。

    请注意,这种方法不是原子操作,并且会留下一个窗口,以便在其他地方生成密钥(假设可能有多个并发执行)并在检查和放置之间放置到 S3 存储桶中。正是因为这种可能性,我首先推荐了一个 UUID 生成器。

    【讨论】:

      【解决方案2】:

      检查您的random_string() 函数。也许缓存你的随机字符串的结果,并在返回之前验证你要返回的字符串没有被使用。

      【讨论】:

      • 是的,这可能是一种更有效的方法,但是在不创建新模型字段的情况下缓存结果的好方法是什么?
      • 为什么在将文件名添加到 s3 存储桶之前,不能持久保存已使用的文件名的本地副本?
      猜你喜欢
      • 2020-09-21
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2016-11-12
      • 1970-01-01
      • 2015-07-27
      • 2020-06-14
      相关资源
      最近更新 更多