An Knoten angehängte Dateien werden niemals vom Server gelöscht, selbst wenn sie vom Knoten entfernt wurden (und diese Bearbeitung gespeichert ist), Drupal 7


10

Ich habe auf meiner Site etwas Seltsames bemerkt: Nach dem Anhängen einer Datei an einen Knoten (über das reguläre Dateifeld) wird diese Datei nie vom Server gelöscht . Ich entferne es vom Knoten, speichere diese Änderung, aber ich kann sehen, dass sich die Datei noch auf dem Server befindet.

Dies macht das Ersetzen von Dateien sehr schwierig, da beim Versuch eines Benutzers, einen Ersatz anzuhängen, dem Dateinamen das Suffix "_0" oder "_1" hinzugefügt wird (da sich die Originaldatei noch auf dem Server befindet und der Name dadurch dupliziert wird). . Das bedeutet, dass wir alle Links zu der Datei finden und jeden so bearbeiten müssen, dass er mit dem neuen Dateinamen / der neuen URL übereinstimmt. Es ist ein totales Durcheinander.

Ich suche online und niemand scheint dieses Problem zu haben - die Dateien sollten vom Server gelöscht werden, sobald sie vom Knoten entfernt wurden.

Irgendwelche Ideen, warum dies in meinem Fall passieren könnte? Ich bin mir nicht sicher, wo ich anfangen soll. Sicherlich hat die Konfigurationsseite 'Dateisystem' nichts dergleichen als Option, die möglicherweise aktiviert wurde. Und die Feldoptionen selbst scheinen nichts von der Art zu haben, die ich möglicherweise versehentlich festgelegt habe. Irgendwelche anderen Ideen?


Wenn ich das richtig verstehe, wird es nicht sofort gelöscht, sondern zum Löschen markiert. Sobald es markiert ist, wird es beim Cron-Lauf gereinigt. Gleiches gilt für die Tabellenbereinigung.
Junedkazi

Gute Idee. Ich habe das allerdings getestet und die Dateien werden nie gelöscht, auch nicht nach mehreren Cron-Läufen.
Boriana Ditcheva

Antworten:


17

Ich habe es verstanden! Es ist eine Revisionssache. Ich denke es macht Sinn. Wenn Sie für diesen Inhaltstyp Revisionen aktiviert haben, bleiben alle Ihre alten Dateien auf dem Server (im Zusammenhang mit alten Revisionen), sodass das Ersetzen einer Datei definitiv schwieriger ist. Wenn Sie versuchen, es zu entfernen und erneut zum Knoten hinzuzufügen, wird der Name / Link aktualisiert, wie in meiner Frage erwähnt. Da eine Datei mit diesem Namen auf dem Server gespeichert bleibt und eine Namensduplizierung vorliegt, werden diese Suffixe "_0", "_1" usw. zu zukünftigen hochgeladenen Versionen des Dateinamens hinzugefügt.

Ich verstehe jedoch, warum dies geschieht, da der ganze Sinn der Überarbeitung darin besteht, auf jede frühere Version der Seite zurückzugreifen.

Die Problemumgehung besteht darin, dass Sie die alte Revision tatsächlich von der Registerkarte "Revision" oder "Moderieren" löschen können (wenn Sie die Workbench-Moderation verwenden), die die Datei enthält, die Sie ersetzen möchten. Laden Sie es dann erneut hoch, und der Name sollte übereinstimmen, ohne dass Sie zurückgehen und Links bearbeiten müssen, die auf diese Datei verweisen.

Hoffe das macht Sinn und hilft auch jemand anderem!


4

Ich hatte den gleichen Anwendungsfall (ich wollte Dateien ersetzen, während der Dateiname beibehalten wurde), und der folgende Code in einem benutzerdefinierten Modul hat dieses Ziel erreicht. Dieser Code basiert auf dem Entity-API- Modul und sollte daher als Abhängigkeit in die Info-Datei Ihres Moduls eingefügt werden. Feedback willkommen.

Dies ermöglicht das sofortige Löschen von Dateien, nachdem Sie auf "Entfernen" geklickt und den Knoten gespeichert haben. Warnung: Dies bedeutet auch, dass Sie beim Entfernen einer Datei und Speichern des Knotens diese Datei nicht zurückerhalten können, indem Sie auf eine frühere Version zurücksetzen.

/**
 * Implements hook_node_update().
 *
 * Delete files from old node revisions.
 */
function MYMODULE_node_update($node) {
  // Array of content types to act on.
  if (in_array($node->type, array('page', 'article'))) {
    $wrapper = entity_metadata_wrapper('node', $node);
    $original_wrapper = entity_metadata_wrapper('node', $node->original);

    // Array of file fields to act on.
    foreach (array('field_public_files', 'field_private_files') as $field) {
      if (!isset($original_wrapper->{$field})) {
        continue;
      }
      $current_files = array();
      $original_files = array();
      // Get files that were attached to the original node (before update).
      foreach ($original_wrapper->{$field}->value() as $file) {
        $original_files[] = $file['fid'];
      }
      // Stop if there were no files previously attached.
      if (empty($original_files)) {
        continue;
      }
      // Get files currently attached to the node (after update).
      foreach ($wrapper->{$field}->value() as $file) {
        $current_files[] = $file['fid'];
      }
      // Delete files that were in the original node but were removed during
      // this update.
      $deleted_files = array_diff($original_files, $current_files);
      foreach ($deleted_files as $fid) {
        if ($file = file_load($fid)) {
          // Delete all usages of the file. Each node revision adds to the usage
          // count.
          file_usage_delete($file, 'file', 'node', $node->nid, 0);
          file_delete($file);
        }
      }
    }
  }
}

wo sollen wir den Code setzen.
BandOfBrothers

Nicht die Antwort, nach der die ursprüngliche Anfrage gesucht hatte, aber ich fand, dass sie genau richtig war. Vielen Dank für das Teilen hier!
Texas-Bronius


0

Dies kann ein Berechtigungsproblem auf dem Server sein. Versuchen Sie dasselbe bei einer Neuinstallation. Wenn das gleiche Problem auftritt, liegt es am Server und nicht an Drupal.

Gibt es etwas in den Protokollen?


Ich habe es gerade auf Berechtigungsprobleme getestet. Ich habe eine lokale Kopie der Site auf meinem PC, und das Problem besteht auch dort. Bei einer Neuinstallation werden die Dateien jedoch tatsächlich gelöscht. Auf meiner problematischen Site werden Dateien auch dann nicht gelöscht, wenn ich den gesamten Knoten lösche, an den sie angehängt sind. Alle anderen Ideen, was dies in meinem Drupal-Setup verursachen könnte. Ich gehe davon aus, dass es ein Modul sein muss ...
Boriana Ditcheva

Zumindest haben Sie es auf die Installation eingegrenzt. Welche Module verwenden Sie? Irgendwelche benutzerdefinierten / Fork / Dev-Module?
Aram Boyajyan

0

Ich hatte kein Glück damit, alte Revisionen zu löschen oder Knoten ohne die angehängten Dateien zu speichern und zurückzukehren. Dies sind die einzigen Dinge, die immer funktionieren:

  1. Knoten löschen
  2. Entfernen der Datei durch Bearbeiten des Knotens und manuelles Löschen der Datei vom Server.

Ich hasse die zweite Option absolut, weshalb ich hier nach einer anderen Lösung suche.

(Ich könnte auch aus dem Rahmen treten, da ich eine Reihe von Clients habe, auf denen D6 ausgeführt wird.)


Ich habe vor langer Zeit ein Ticket dafür gestartet: drupal.org/node/1816584 . Melden Sie sich an, wenn Sie möchten, und vielleicht kann es eine ernstere Diskussion darüber geben, wenn es zusätzliche Stimmen gibt.
Boriana Ditcheva

0

Dieses Problem trat auch bei der Workbench-Moderation auf, und beim Einfügen von Dateifeldern wurden die alten Versionen der hochgeladenen Dateien angezeigt, wenn Dateien mit demselben Namen in verschiedenen Versionen eines Dokuments erneut hochgeladen wurden.

Um einen reibungslosen Ablauf zu gewährleisten, fügen Sie die VID des Knotens als Ordner zum Datei-Upload-Pfad hinzu. Normalerweise mache ich so etwas.

Ordnerpfad = Assets / [Knoten: nid] - [Knoten: Titel] / [Knoten: vid]

Ja, es sind hässliche lange Ordner mit Unterordner-Wahnsinn, aber Sie können Dateien sehr einfach über die Knoten-ID oder den Titel finden, und dann verhindert der Unterordner Namenskollisionen, sodass Sie viele Versionen derselben Datei mit demselben Namen behalten können. Später können Sie dann die alten Revisionen löschen, wenn Sie Speicherplatz bereinigen möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.