2017-09-21 60 views
0

我正在使用django和django-storage以及S3來管理一些上傳的文件。這些文件可以在「功能」文件夾上傳,例如:移動文件,而無需在django-storages和S3中打開

/上傳/產品/ PRODUCT_CODE/功能/ .PDF

,我想文件搬出這功能文件夾,刪除原始文件(最終當所有文件已被處理包含文件夾),這樣他們就可以在這裏找到:

/上傳/產品/ 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 

這工作,但它是非常緩慢的長文件列表作爲系統將不得不打開每個文件並重新保存它。

有沒有一種方法可以重構此代碼以避免昂貴的打開和保存調用?

+0

它會成爲使用AWS Command Line Interface的選項嗎?那麼你就不需要在你的python代碼中執行這些移動操作,而是讓命令行命令爲你完成這項工作。 – matyas

回答

0

你也可以繼承的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對象的方法,並使用從和路徑調用拷貝文件。

相關問題