web-dev-qa-db-ja.com

ファイルフィールドストレージをpublic://から別のストリームラッパー(s3://など)に移動します。

私はこれを少し探していましたが、Drupal 7では、D7がストリームラッパーをサポートし、フィールドがコアの一部であるため、比較的簡単です...しかし、私はドキュメントが見つかりません。

ノードに数千のファイルが添付されたファイルフィールドがあり、現在public://を使用しています。

AmazonS ​​モジュールもインストールしてあり、他のいくつかのファイルフィールドはすでにs3://ストリームラッパーを使用するように設定されています。

次に、public://を使用してファイルフィールドをs3://に移行し、サイトのファイルフォルダーに既にアップロードされているすべてのファイルをs3に切り替えます。ファイルを手動でS3のバケットにコピーできますが、パブリックではなくs3を介してファイルをロードするには、Drupal /データベースで正確に何をする必要がありますか?

file_managedpublic://custom/pathテーブルのすべての行を更新してs3://custom/pathに変更するカスタムクエリを作成することを考えましたが、(a)異なるパスで移行された古いファイルがいくつかありますcustom/pathより(b)これがS3を使用するDrupal)を取得する正しい方法であるかどうかはわかりません。

[Edit:APIのfile_move()関数に気づきました—これを使用してファイルを移動できます(フィールドのフィールドストレージを切り替えた後) UI)ファイルを手動でコピーしてデータベースを更新する代わりに?]。

3
geerlingguy

2つのサーバー間で一致するパスの場合、file_managedのパスをs3://で始まるように変更し、キャッシュをクリアすると、S3モジュールが残りを処理します。

このモジュール は本当に役立つはずです。あなたがやろうとしていることとかなり似ている誰かのためのモジュールを書いたところです(ただし、ファイルがローカルファイルシステムからS3にプルーニングされている場合を除く)。 cron)とそのリンクのモジュールは素晴らしい出発点でした。

S3モジュールは完全に機能するストリームラッパーを実装しているため、通常のすべてのファイル関数(file_copyfile_movefile_deleteなど)を通常どおり使用できます。ファイルがあります。

1
Clive