it-swarm.com.de

Wie mache ich vorhandene öffentliche Dateien privat?

Angenommen, ich habe einen Knotentyp "Artikel" mit einem Feld "Datei", das für die Verarbeitung öffentlicher Dateien festgelegt ist. Viele Artikel und Dateien werden hinzugefügt.

Jetzt ändern sich plötzlich die Spezifikationen und der "Artikel" wird hinter ein Login verschoben und daher müssen auch die angehängten Dateien geändert werden, um nicht mehr öffentlich zugänglich zu sein.

Ich habe bereits herausgefunden wie man das Dateisystem für das Dateifeld von öffentlich auf privat ändert ziemlich einfach durch erneutes Importieren des manuell aktualisierten field.storage.node.field_file.yml config. Aber: Dies betrifft nur neue Dateien, die nach dem Wechsel hinzugefügt werden. Es funktioniert nicht für vorhandene Dateien. Sie sind weiterhin öffentlich zugänglich. Viele tausend vorhandene Dateien müssten manuell erneut hochgeladen werden, um sie auch privat zu machen.

Hat jemand von euch das in D8 schon einmal gelöst? Wenn ja, wie dann?

Im Moment kann ich nur daran denken, alle "Artikel" -Knoten programmgesteuert abzufragen, dann alle Knoten zu durchsuchen, die Dateien abzurufen, sie vorübergehend an einem anderen Ort zu speichern, das Feld zu leeren und dann zu versuchen, die Dateien programmgesteuert erneut hochzuladen (wahrscheinlich meine nächste Frage) und speichern Sie dann jeden Knoten neu.

Klingt das vernünftig? Oder können Sie sich einen anderen Ansatz vorstellen, der hier funktionieren könnte (in D8)?

8
leymannx

Vielen Dank für die Antworten! FileField Paths ist definitiv der richtige Weg.

  1. Aktualisieren Sie den Feldspeicher des Dateifelds, um private Dateien zu verarbeiten.
  2. Führen Sie FileField Paths ' Rückwirkendes Update Im Dateifeld Ihres Inhaltstyps aus.

Schritt 1. kann innerhalb von hook_update_N Ausgeführt werden (wenn Sie das Konfigurationsmanagement verwenden, tun Sie dies lokal und exportieren Sie dann die aktualisierte Konfiguration und stellen Sie den resultierenden *.yml Bereit):

$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();
  }
}

Befolgen Sie alternativ das manuelle Konfigurationsupdate und importieren Sie es erneut, wie in der Frage vorgeschlagen.


Schritt 2. Gehen Sie zum Bearbeitungsbildschirm Ihres Dateifelds und starten Sie das Rückwirkende Update beim Speichern des Formulars:

(enter image description here

5
leymannx

Ich habe dies für Drupal 7, aber nicht in Drupal 8) versucht.

Ich glaube, dass es ähnlich funktionieren sollte, da es bereits eine D8-Version für das erforderliche Modul gibt: FileField Paths . Ich habe das Modul zuerst installiert und aktiviert, bevor ich die folgenden Schritte ausgeführt habe:

nur für den Fall, dass jemand dies tun möchte, sind hier die Schritte:

  1. sichern Sie Ihre Site und db
  2. kopieren Sie die Tabelle für Ihr Feld, um eine Sicherung zu erstellen (in meinem Fall habe ich Folgendes kopiert: field_data_field_attachments to field_data_field_attachments_bk)
  3. leere Tabelle field_data_field_attachments
  4. gehen Sie zu drupal und die Option zum Ändern des Dateisystems sollte verfügbar sein, ändern Sie sie also
  5. kopieren Sie alle Daten von field_data_field_attachments_bk zurück nach field_data_field_attachments
  6. gehen Sie zu Drupal, wählen Sie Ihren Inhaltstyp aus, wählen Sie Ihr Dateifeld aus und wählen Sie in den Dateipfadeinstellungen die Option "Rückwirkende Aktualisierung"
  7. klicken Sie auf Speichern, um alle Ihre Dateien an die richtige Stelle im Dateisystem zu verschieben und Ihre Datenbank auf den neuen Pfad zu aktualisieren

- A Romka

vollständiger Thread

3
Chris Happy

Es ist ganz einfach, ich habe das selbst getestet und es funktioniert.

1) Bei PHPMyAdmin oder einer DB-Verwaltungsanwendung müssen Sie sich node__field_NAME Anschauen, in dem sich Ihre Dateien befinden. Notieren Sie alle field_NAME_target_id-Nummern, die zu Ihrem Inhaltstyp gehören.

2) Gehen Sie zur Tabelle file_managed.

3) Exportieren Sie die Tabelle als SQL-Datei

4) Öffnen Sie die SQL-Datei mit einer Textbearbeitungs-App. Benennen Sie alle public:// In private:// Um, für diejenigen, die die von Ihnen aufgezeichnete FID-Nummer haben.

5) Importieren Sie .sql und überschreiben Sie die Tabelle file_managed. OR Sie könnten die Tabelle löschen und dann importieren.

6) Verschieben Sie die Dateien in den privaten Ordner.

  • Wichtig : Stellen Sie sicher, dass es dieselbe übergeordnete Ordnerstruktur hat. Wenn es zuvor unter /files/2018-06/some.jpg War, muss es privat /private/2018-06/some.jpg Sein.

    • Außerdem müssen keine Bilddateien im Bildstil verschoben werden. Diese werden automatisch erstellt. Sie müssen also nur das Original greifen.

7) Leere alle Caches.


Ich bin sicher, Sie könnten die SQL-Abfrage verwenden, um 1 bis 5 auszuführen. Grundsätzlich müssen Sie nur die spezifischen Werte der Spalte uri in der Tabelle field_managed Aktualisieren.

3
No Sssweat

Mit meinem Drupal 8.6.3 funktioniert das rückwirkende Update nicht.

Sie müssen noch Schritt 1 ausführen, um den Feldspeicher Ihres Feldes zu aktualisieren.

Dann müssen Sie alle vorhandenen Dateien über die Datenbank aktualisieren mit:

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

In meinem Fall aktualisiere ich nur die Dateien. Deshalb verwende ich diese where-Klausel.

Vergessen Sie nicht, den Cache nach dieser SQL-Abfrage zu leeren.

2