在django storage s3上移动文件

时间:2018-02-12 18:45:29

标签: django amazon-s3 django-storage

我使用django-storage与amazon s3,配置接近本指南: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-storage,是否有一种方法可以使用存储功能进行不同的操作?

1 个答案:

答案 0 :(得分:1)

您可能应该已经发现s3仅有创建,复制和删除方法。因此,您应该实现一个将重命名的功能:新名称复制和旧删除。然后,您可以通过重新定义模型的保存方法或通过为该模型实现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