【问题标题】:Move file on django storage s3在 django storage s3 上移动文件
【发布时间】:2018-02-12 18:45:29
【问题描述】:

我在 amazon s3 上使用 django-storages,配置接近本指南:https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

现在我有一种情况,我想在保存模型时重命名很多文件,在实现 s3 存储后端之前,我只是简单地调用了 os.rename:

os.rename(initial_path, new_path)

既然这显然不适用于 django-storages,有没有一种方法可以使用存储的功能以不同的方式做到这一点?

【问题讨论】:

    标签: django amazon-s3 python-django-storages


    【解决方案1】:

    您现在可能应该已经发现 s3 只有创建、复制和删除方法。所以你应该实现一个可以重命名的函数:copy-with-new-name & delete-old。然后,您可以通过重新定义模型的保存方法或为该模型实现 django 信号来放置此功能。

    伪代码:

    def rename_s3(old_key, new_key):
      s3.copy(old_key, new_key)
      s3.delete(old_key)
    
    def rename_multiple(dict_of_keys):
      for old_key, new_key in dict_of_keys:
        rename_s3(old_key, new_key)
    

    具体记不太清了,实际复制的代码大概是这样的:

    from boto3.session import Session
    
    session = Session(aws_access_key_id="X", aws_secret_access_key="Y")
    s3 = session.resource('s3')
    
    source_bucket = s3.Bucket("bucket-A")
    target_bucket = s3.Bucket("bucket-B") # this can be "bucket-A" if you want to copy it in the same bucket
    
    old_key = "path/to/old/file/my.csv"
    new_key = "path/to/new/file/my_new_name.csv"
    target_bucket.copy(Key= new_key, CopySource={"Bucket": "bucket-A", "Key": old_key})
    

    上述解决方案具有在属于不同账户的存储桶之间复制文件的优势(只要账户-B 对账户-A 具有读取权限)。

    请注意,您也可以使用 S3.Client.copy 使用加速复制,但它不支持在不同区域之间复制文件(文档中的说明)。

    一些不错的链接:

    Boto3 Docs 1.13.21 documentation(S3.Bucket.copy)

    Boto3 Docs 1.13.21 documentation(S3.Client.copy)

    Example tutorial on copying files

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      相关资源
      最近更新 更多