gpt4 book ai didi

python - 在 django-storages 和 S3 中移动文件而不打开

转载 作者:行者123 更新时间:2023-12-05 04:09:14 25 4
gpt4 key购买 nike

我正在使用带有 django-storages 和 S3 的 django 来管理一些上传的文件。这些文件可以上传到“功能”文件夹中,例如:

/uploads/products/product_code/feature/filename.pdf

我想将文件移出此feature 文件夹,删除原始文件(并最终在处理完所有文件后删除包含的文件夹),以便可以在以下位置找到它们:

/uploads/products/product_code/文件名.pdf

我目前有以下代码来执行此操作:

def move_files_in_folders(path, folder):
files = default_storage.listdir(path+"/"+folder)
returnable_file_list = list()

for filename in files[1]:
if filename is not '':

movable_file = default_storage.open(path+'/'+folder+'/'+filename)
default_storage.save(path+'/'+filename, movable_file)
default_storage.delete(path+'/'+folder+'/'+filename)
returnable_file_list.append(filename)

default_storage.delete(path + '/' + folder)
return returnable_file_list

这行得通,但对于长文件列表来说速度很慢,因为系统必须打开每个文件并重新保存。

有什么方法可以重构此代码以避免昂贵的打开和保存调用?

最佳答案

您可以子类化 S3Boto3Storage 类并添加一个将文件从 from_path 复制到 to_path 的方法

from storages.backends.s3boto3 import S3Boto3Storage

class MyS3Storage(S3Boto3Storage):
def copy(self, from_path, to_path):
from_path = self._normalize_name(self._clean_name(from_path))
to_path = self._normalize_name(self._clean_name(to_path))

copy_result = self.connection.meta.client.copy_object(
Bucket=self.bucket_name,
CopySource=self.bucket_name + "/" + from_path,
Key=to_path)

if copy_result['ResponseMetadata']['HTTPStatusCode'] == 200:
True
else:
False

之后,您可以创建 MyS3Storage 对象并使用 from 和 to 路径调用复制文件。

关于python - 在 django-storages 和 S3 中移动文件而不打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46344058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com