在django存储s3上移动文件

在django存储s3上移动文件,django,amazon-s3,python-django-storages,Django,Amazon S3,Python Django Storages,我将django storages与amazon s3一起使用,其配置与本指南相近: 现在我遇到了这样一种情况:在实现s3存储后端之前,我想在保存模型时重命名许多文件。重命名: os.rename(initial_path, new_path) 由于这显然不适用于django存储,有没有一种方法可以使用存储的功能来实现这一点 您可能已经发现,现在s3只有create、copy和delete方法。因此,您应该实现一个重命名函数:使用新名称复制&删除旧名称。然后,您可以通过重新定义模型的save方

我将django storages与amazon s3一起使用,其配置与本指南相近:

现在我遇到了这样一种情况:在实现s3存储后端之前,我想在保存模型时重命名许多文件。重命名:

os.rename(initial_path, new_path)

由于这显然不适用于django存储,有没有一种方法可以使用存储的功能来实现这一点

您可能已经发现,现在s3只有create、copy和delete方法。因此,您应该实现一个重命名函数:使用新名称复制&删除旧名称。然后,您可以通过重新定义模型的save方法或为该模型实现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使用加速复制,但是它不支持在不同区域之间复制文件(文档中有说明)

一些不错的链接: