Pliki dołączone do węzłów nigdy nie są usuwane z serwera nawet po ich usunięciu z węzła (i ta edycja jest zapisana), Drupal 7

10

Zauważyłem coś dziwnego na mojej stronie: po dołączeniu pliku do węzła (za pomocą zwykłego pola pliku) plik ten nigdy nie jest usuwany z serwera . Usuwam go z węzła, zapisuję tę zmianę, ale widzę, że plik nadal znajduje się na serwerze.

To sprawia, że ​​zamiana plików jest bardzo trudna, ponieważ gdy użytkownik próbuje dołączyć zamiennik, nazwa pliku ma przyrostek „_0” lub „_1” (ponieważ oryginalny plik jest nadal na serwerze, co powoduje, że nazwa jest duplikatem) . Oznacza to, że musielibyśmy znaleźć wszystkie linki do pliku i edytować każdy z nich, aby pasował do nowej nazwy pliku / adresu URL. To totalny bałagan.

Patrzę online i wydaje się, że nikt nie ma tego problemu - pliki powinny zostać usunięte z serwera po ich usunięciu z węzła.

Jakieś pomysły, dlaczego tak się dzieje w moim przypadku? Nie jestem pewien, od czego zacząć. Z pewnością strona konfiguracji „Systemu plików” nie ma nic takiego jako opcja, która mogła zostać sprawdzona. Wydaje się, że same opcje pól nie mają nic takiego, co mógłbym przypadkowo ustawić. Jakieś inne pomysły?

Boriana Ditcheva
źródło
Jeśli dobrze rozumiem, nie jest on natychmiast usuwany, ale jest oznaczony do usunięcia. Po zaznaczeniu jest czyszczony podczas uruchamiania crona. To samo dotyczy czyszczenia tabel.
junedkazi
Dobre myślenie. Testowałem to, ale pliki nigdy nie są usuwane, nawet po kilku uruchomieniach crona.
Boriana Ditcheva

Odpowiedzi:

17

Mam to! To kwestia rewizji. Myślę, że to ma sens. Jeśli masz włączone wersje dla tego typu zawartości, wszystkie stare pliki są przechowywane na serwerze (powiązane ze starymi wersjami), więc wymiana pliku jest zdecydowanie trudniejsza. Jeśli spróbujesz go usunąć i dodać ponownie do węzła, nazwa / link zostanie zaktualizowana, jak wspomniałem w moim pytaniu. Ponieważ plik o tej nazwie jest przechowywany na serwerze i występuje duplikacja nazwy, dodaje on sufiksy „_0”, „_1” itd. Do przyszłych przesłanych wersji nazwy tego pliku.

Rozumiem jednak, dlaczego tak się dzieje, ponieważ cały punkt weryfikacji jest w stanie przywrócić do dowolnej wcześniejszej wersji strony.

Obejściem tego problemu jest to, że można faktycznie usunąć starą wersję z karty „Rewizja” lub „Moderuj” (jeśli używasz Moderacji środowiska roboczego), która zawiera plik, który próbujesz zastąpić. Następnie prześlij go ponownie, a nazwa powinna się zgadzać bez konieczności cofania się i edytowania linków prowadzących do tego pliku.

Mam nadzieję, że to ma sens i że pomaga również komuś innemu!

Boriana Ditcheva
źródło
4

Miałem ten sam przypadek użycia (chcąc zastąpić pliki przy zachowaniu nazwy pliku), a następujący kod w module niestandardowym spełnił ten cel. Ten kod opiera się na module Entity API , dlatego należy go dodać jako zależność w pliku .info modułu. Witamy mile widziane.

Pozwala to na natychmiastowe usunięcie plików po kliknięciu „Usuń”, a następnie zapisaniu węzła. Ostrzeżenie: oznacza to również, że po usunięciu pliku i zapisaniu węzła nie można odzyskać tego pliku, przywracając wcześniejszą wersję.

/**
 * 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);
        }
      }
    }
  }
}
Cottser
źródło
gdzie powinniśmy umieścić kod.
BandOfBrothers
Nie była to odpowiedź, której szukała pierwotna prośba, ale znalazłem ją na miejscu. Dzięki za udostępnienie tutaj!
texas-bronius
0

Może to być problem z uprawnieniami na serwerze. Spróbuj tego samego w czystej instalacji - jeśli masz ten sam problem, to zależy od serwera, a nie od Drupala.

Czy jest coś w logach?

Aram Boyajyan
źródło
Właśnie przetestowałem go pod kątem problemów z uprawnieniami. Mam lokalną kopię witryny na moim osobistym komputerze i problem też tam istnieje. Jednak przy czystej instalacji pliki rzeczywiście zostają usunięte. W mojej problematycznej witrynie pliki nie są usuwane nawet po usunięciu całego węzła, do którego są przyłączone. Wszelkie inne pomysły, które mogą być przyczyną tego w mojej konfiguracji Drupala. Zakładam, że to musi być moduł ...
Boriana Ditcheva
Przynajmniej zawęziłeś to do instalacji. Z jakich modułów korzystasz? Jakieś moduły niestandardowe / fork / dev?
Aram Boyajyan
0

Nie miałem szczęścia w usuwaniu starych wersji lub zapisywaniu węzłów bez dołączonych plików i powrotu. To jedyne rzeczy, które zawsze działają:

  1. Usuwanie węzła
  2. Usuwanie pliku poprzez edycję węzła i ręczne usuwanie pliku z serwera.

Nienawidzę drugiej opcji, dlatego szukam tutaj innego rozwiązania.

(Mógłbym również przekraczać granice, ponieważ mam grupę klientów korzystających z D6.)

Wray Bowling
źródło
Dawno temu zacząłem o tym pisać : drupal.org/node/1816584 . Włącz się, jeśli chcesz, i być może może być poważniejsza dyskusja na ten temat, jeśli będą dodatkowe głosy.
Boriana Ditcheva
0

Wystąpił również ten problem z moderacją środowiska roboczego, a wstawianie pola pliku faktycznie pokazuje stare wersje przesyłanych plików, gdy pliki o tej samej nazwie są ponownie przesyłane w różnych wersjach dokumentu.

Aby wszystko działało sprawnie, dodaj vid węzła jako folder do ścieżki przesyłania plików. Zwykle robię coś takiego.

Ścieżka folderu = zasoby / [węzeł: nid] - [węzeł: tytuł] / [węzeł: vid]

Tak, są to brzydkie długie foldery z szaleństwem podfolderów, ale pliki można łatwo znaleźć za pomocą identyfikatora lub tytułu węzła, a następnie podfolder zapobiega kolizjom nazw, dzięki czemu można przechowywać wiele wersji tego samego pliku o tej samej nazwie. Następnie możesz usunąć stare wersje, jeśli chcesz wyczyścić miejsce.

Aidan Foster
źródło