web-dev-qa-db-ja.com

既存の公開ファイルをプライベートにする方法は?

パブリックファイルを処理するように設定されたフィールド「File」を持つノードタイプ「Article」があるとします。多くの記事とファイルが追加されます。

これで、仕様が突然変更され、「記事」がログインの背後に移動するため、添付ファイルもパブリックにアクセスできないように変更する必要があります。

私はすでに発見しました ファイルフィールドのファイルシステムをパブリックからプライベートに変更する方法 手動で更新されたfield.storage.node.field_file.yml configを再インポートすることで、かなり簡単にできます。ただし、これは、切り替え後に追加される新しいファイルにのみ影響します。既存のファイルでは機能しません。彼らはまだ公的にアクセス可能です。何千もの既存のファイルを手動で再アップロードして、それらもプライベートにする必要があります。

あなたの誰かが以前にD8でそれを解決したことがありますか?もしそうなら、どのように?

私が今考えることができるのは、すべての「Article」ノードをプログラムでクエリしてから、すべてのノードを調べ、ファイルを取得し、一時的に別の場所に保存し、フィールドを空にして、プログラムでファイルを再アップロードすることです(おそらく私の次の質問)次に、各ノードを再保存します。

それは理にかなっていますか?または、ここ(D8)で機能する可能性のある他のアプローチを考えられますか?

8
leymannx

答えてくれてありがとう! FileField Paths は間違いなく進むべき道です。

  1. ファイルフィールドのフィールドストレージを更新して、プライベートファイルを処理します。
  2. コンテンツタイプのファイルフィールドでFileField Paths 'Retroactive updateを実行します。

ステップ1。hook_update_N内から実行できます(構成管理を使用している場合は、ローカルで実行し、更新された構成をエクスポートして、結果の*.yml):

$field_type = 'file';
$field_name = 'field_file';

if (!$field_storage_configs = \Drupal::entityManager()
  ->getStorage('field_storage_config')
  ->loadByProperties(['type' => $field_type])) {
  return;
}

foreach ($field_storage_configs as $field_storage) {
  // Note: These settings apply to the field_file field everywhere it is
  // used.
  if ($field_storage->getName() == $field_name) {
    $field_storage->setSetting('uri_scheme', 'private');
    $field_storage->enforceIsNew(FALSE);
    $field_storage->save();
  }
}

または、手動の構成更新に従って、質問で提案されているように再インポートします。


ステップ2。は、ファイルフィールドの編集画面に移動し、遡及更新フォームを保存すると:

enter image description here

5
leymannx

私はDrupal 7に対してこれを行いましたが、Drupal 8.で試していません。

必要なモジュールのD8リリースが既にあるので、同様に機能するはずです。 FileField Paths 。以下の手順を実行する前に、まずモジュールをインストールして有効にしました。

誰かがこれを行うことを望んでいる場合に備えて、ここに手順があります:

  1. サイトとデータベースをバックアップ
  2. フィールドのテーブルをコピーしてバックアップを作成します(私の場合は、field_data_field_attachmentsをfield_data_field_attachments_bkにコピーしました)
  3. 空のテーブルfield_data_field_attachments
  4. drupalに移動すると、ファイルシステムを変更するオプションが利用できるはずです。変更してください。
  5. field_data_field_attachments_bkからすべてのデータをコピーしてfield_data_field_attachmentsに戻す
  6. drupalに移動し、コンテンツタイプを選択し、ファイルフィールドを選択し、ファイルパス設定で遡及更新を選択します
  7. [保存]をクリックすると、すべてのファイルがファイルシステムの適切な場所に移動し、dbが新しいパスに更新されます

Aロムカ

フルスレッド

3
Chris Happy

それは非常に簡単です、私はこれを自分でテストし、それは動作します。

1)PHPMyAdminまたはDB管理アプリケーションを使用して、ファイルが含まれているnode__field_NAMEを確認する必要があります。コンテンツタイプに属するすべてのfield_NAME_target_id番号を記録します。

2)file_managedテーブルに移動します。

3)テーブルを.sqlファイルとしてエクスポート

4)テキスト編集アプリで.sqlファイルを開きます。記録したfid番号を持つもののすべてのpublic://private://に名前変更します。

5).sqlをインポートし、テーブルfile_managedをオーバーライドします。 ORテーブルをクリアしてからインポートできます。

6)ファイルをプライベートフォルダに移動します。

  • 重要:親フォルダー構造が同じであることを確認してください。以前は/files/2018-06/some.jpgの下にあった場合、プライベートでは/private/2018-06/some.jpgである必要があります

    • また、画像スタイルの画像ファイルを移動する必要はありません。これらは自動的に作成されます。したがって、オリジナルを取得するだけで済みます。

7)すべてのキャッシュをフラッシュします。


SQLクエリを使用して1〜5を実行できると思います。基本的には、field_managedテーブルのuri列の特定の値を更新するだけです。

3
No Sssweat

私のDrupal 8.6.3では、レトロアクティブ更新は機能しません。

フィールドのフィールドストレージを更新するには、ステップ1を実行する必要があります。

次に、データベースを介して既存のすべてのファイルを更新する必要があります。

UPDATE file_managed SET uri = REPLACE( 
    uri,
    'public://',
    'private://'
)
WHERE filemime like 'application%';

私の場合、ファイルのみを更新しているので、このwhere句を使用しています。

このSQLクエリの後でキャッシュをクリアすることを忘れないでください。

2