我在 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 存储,有没有一种方法可以使用存储的功能来以不同的方式做到这一点?
正如您现在可能应该发现的那样,s3 只有创建、复制和删除方法。所以你应该实现一个可以重命名的函数:copy-with-new-name & delete-old。然后,您可以通过重新定义模型的 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,但它不支持在不同区域之间复制文件(文档中的说明)。
一些不错的链接:
Boto3 文档 1.13.21 文档(S3.桶复制)
Boto3 文档 1.13.21 文档(S3.客户端复制)
有关复制文件的示例教程