2

このガイドに近い構成で、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-storagesでは機能しないため、ストレージの機能を使用して別の方法で行う方法はありますか?

4

1 に答える 1

1

お気づきかもしれませんが、s3 には create、copy、delete メソッドしかありません。したがって、名前を変更する関数を実装する必要があります: copy-with-new-name & delete-old. 次に、モデルの保存メソッドを再定義するか、そのモデルに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 ドキュメント (S3.Bucket.copy)

Boto3 Docs 1.13.21 ドキュメント (S3.Client.copy)

ファイルのコピーに関するサンプル チュートリアル

于 2020-06-04T07:31:09.383 に答える