Файли, приєднані до вузлів, ніколи не видаляються з сервера навіть після їх видалення з вузла (і це редагування збережено), Drupal 7


10

Я помітив щось дивне на своєму сайті: після приєднання файлу до вузла (через звичайне поле файлу) цей файл ніколи не видаляється з сервера . Я видаляю його з вузла, зберігаю цю зміну, але я бачу, що файл все ще знаходиться на сервері.

Це робить заміну файлів дуже складною, оскільки, коли користувач намагається долучити заміну, ім'я файлу має "_0" або "_1" суфікс до нього (оскільки вихідний файл все ще знаходиться на сервері, і це робить ім'я копією) . Це означає, що нам знадобиться знайти всі посилання на файл і відредагувати кожне, щоб відповідати новому імені файлу / URL-адресі. Це тотальний безлад.

Я шукаю в Інтернеті, і, здається, ніхто не має цієї проблеми - файли повинні бути видалені з сервера, як тільки вони будуть видалені з вузла.

Будь-які ідеї, чому це може статися в моєму випадку? Я не впевнений, з чого почати шукати. Звичайно, сторінка конфігурації «Файлова система» не має нічого такого характеру, як опція, яку, можливо, було перевірено. І самі варіанти поля, схоже, не мають нічого такого характеру, який я, можливо, ненароком встановив. Будь-які інші ідеї?


Якщо я правильно розумію, це видаляється не відразу, але воно позначається для видалення. Після того, як вона позначена, вона очищається під час запуску кронів. Те саме стосується очищення таблиць.
junedkazi

Гарне мислення. Я проте протестував це, хоча файли ніколи не видаляються, навіть після декількох запусків cron.
Боряна Дітчева

Відповіді:


17

Зрозумів! Це ревізія. Я думаю, це має сенс. Якщо для цього типу вмісту увімкнено версії , він зберігає всі ваші старі файли на сервері (пов'язані зі старими версіями), тому замінити файл, безумовно, важче. Якщо ви спробуєте видалити його та знову додати його до вузла, ім’я / посилання буде оновлено, як я вже згадував у своєму запитанні. Оскільки файл із цим іменем зберігається на сервері і є дублювання імен, він додає ті суфікси "_0", "_1" тощо до майбутніх завантажених версій імені цього файлу.

Я розумію, чому це відбувається, хоча вся точка перегляду вдається повернутися до будь-якої попередньої версії сторінки.

Обхід полягає в тому, що ви можете фактично видалити стару версію з вкладки «Ревізія» або «Помірно» (якщо використовується Workbench Moderation), яка містила файл, який ви намагаєтеся замінити. Потім завантажте його ще раз, і ім’я повинне відповідати, без того, щоб вам потрібно було повертатися та редагувати будь-які посилання, що вказують на цей файл.

Сподіваюсь, що це має сенс і що це допомагає ще комусь!


4

У мене був той самий випадок використання (бажаючи замінити файли, зберігаючи ім’я файлу), і наступний код у спеціальному модулі досяг цієї мети. Цей код покладається на модуль API Entity, тому його слід додати як залежність у вашому .info-файлі модуля. Відгуки Ласкаво просимо.

Це дозволяє негайно видалити файли після натискання кнопки «Видалити», а потім збереження вузла. Попередження: це також означає, що коли Ви видалите файл і збережете вузол, ви не зможете повернути його назад, повернувшись до попередньої версії.

/**
 * 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);
        }
      }
    }
  }
}

куди ми повинні поставити код.
BandOfBrothers

Не шукав оригінального запиту відповіді, але я виявив, що він потрапив просто на місце. Дякуємо, що поділилися тут!
texas-bronius

2

Я зробив модуль, який видаляє осиротілі файли, як згадується в цій темі:

https://www.drupal.org/project/fancy_file_delete

Він також може змушувати видаляти файли вручну, а також керувати файлами без керування.


0

Це може бути проблема дозволів на сервері. Спробуйте те ж саме при чистому встановленні - якщо у вас виникають ті самі проблеми, то це залежить від сервера, а не від Drupal.

Чи є в журналах щось?


Я просто перевірив це на наявність дозволів. У мене є локальна копія сайту на моїй персональній машині, і проблема існує і там. Однак при чистому встановленні файли дійсно видаляються. На моєму проблемному сайті файли не видаляються навіть після видалення всього вузла, до якого вони приєднані. Будь-які інші ідеї, що може спричинити це в моїй програмі Drupal. Я припускаю, що це повинен бути модуль ...
Боряна Дітчева

Принаймні, ви звузили його до установки. Які модулі ви використовуєте? Будь-які спеціальні модулі / fork / dev?
Арам Бояян

0

Мені не пощастило видалити старі версії чи зберегти вузли без прикріплених файлів та повернутися назад. Це єдині речі, які завжди працюють:

  1. Видалення вузла
  2. Видалення файлу за допомогою редагування вузла та видалення файлу вручну з сервера.

Я абсолютно ненавиджу другий варіант, тому я тут шукаю іншого рішення.

(Я також міг би вийти за межі, оскільки у мене є купа клієнтів, які працюють з D6.)


Я розпочав про це квиток давно: drupal.org/node/1816584 . Звучайте, якщо хочете, і, можливо, може бути серйозніше обговорення цього питання, якщо є додаткові голоси.
Боряна Дітчева

0

Я зіткнувся з цією проблемою також з модерацією робочого столу, і в поле вставки файлу фактично відображаються старі версії завантажених файлів, коли файли з тим самим іменем повторно завантажуються в різних редакціях документа.

Щоб зробити роботу безперебійно, додайте VID-код вузла як папку в шлях завантаження файлу. Зазвичай я роблю щось подібне.

Шлях до папки = активи / [вузол: nid] - [вузол: назва] / [вузол: vid]

Так, це потворні довгі папки з божевіллям підпапок, але ви можете легко знайти файли за допомогою ідентифікатора вузла або заголовка, і тоді підпапка запобігає зіткненням імен, щоб ви могли зберегти багато версій одного файлу з тим самим іменем. Потім пізніше ви можете видалити старі версії, якщо хочете очистити місце.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.