Файлы, прикрепленные к узлам, никогда не удаляются с сервера, даже после того, как они удалены с узла (и это изменение сохранено), Drupal 7

10

Я заметил кое-что странное на моем сайте: после присоединения файла к узлу (через обычное поле файла) этот файл никогда не удаляется с сервера . Я удаляю его из узла, сохраняю это изменение, но вижу, что файл все еще находится на сервере.

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

Я смотрю в Интернете, и, кажется, никто не имеет этой проблемы - файлы должны быть удалены с сервера, как только они будут удалены из узла.

Есть идеи, почему это может происходить в моем случае? Я не уверен, с чего начать. Конечно, на странице конфигурации «Файловая система» нет ничего такого, что могло бы быть проверено. И сами параметры поля, кажется, не имеют ничего такого, что я мог бы случайно установить. Есть еще идеи?

Борина Дитчева
источник
Если я правильно понимаю, он не удаляется сразу, но помечается для удаления. Как только он отмечен, он очищается при запуске cron. То же самое в случае очистки таблиц.
Джунедкази
Хорошая мысль. Я все же проверил это, и файлы никогда не удаляются, даже после нескольких запусков cron.
Борина Дитчева

Ответы:

17

Я понял! Это доработка. Я думаю, это имеет смысл. Если у вас включены ревизии для этого типа контента, он сохраняет все ваши старые файлы на сервере (связанные со старыми ревизиями), поэтому замена файла определенно сложнее. Если вы попытаетесь удалить его и снова добавить в узел, имя / ссылка будут обновлены, как я уже упоминал в своем вопросе. Поскольку файл с таким именем хранится на сервере и существует дублирование имени, он добавляет эти суффиксы "_0", "_1" и т. Д. В будущие загруженные версии имени этого файла.

Я понимаю, почему это происходит, поскольку весь смысл пересмотра заключается в возможности вернуться к любой прошлой версии страницы.

Обходной путь заключается в том, что вы можете удалить старую ревизию на вкладке «Редакция» или «Умеренная» (если используется модерация Workbench), в которой содержится файл, который вы пытаетесь заменить. Затем загрузите его снова, и имя должно совпадать, без необходимости возвращаться и редактировать любые ссылки, указывающие на этот файл.

Надеюсь, что это имеет смысл и помогает кому-то еще!

Борина Дитчева
источник
4

У меня был такой же вариант использования (желание заменить файлы при сохранении имени файла), и следующий код в пользовательском модуле достиг этой цели. Этот код опирается на модуль Entity API, поэтому его следует добавить в качестве зависимости в файл .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);
        }
      }
    }
  }
}
Cottser
источник
где мы должны положить код.
BandOfBrothers
Не тот ответ, который искал первоначальный запрос, но я обнаружил, что он попал в точку. Спасибо, что поделились здесь!
texas-bronius
2

Я сделал модуль, который удаляет потерянные файлы, как упоминалось в этой теме:

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

Он также может принудительно удалять файлы вручную и неуправляемые файлы.

Джон О
источник
0

Это может быть проблема с разрешениями на сервере. Попробуйте сделать то же самое при чистой установке - если у вас возникла та же проблема, то это зависит от сервера, а не от Drupal.

Есть ли что-нибудь в логах?

Арам Бояджян
источник
Я только что проверил это на проблемы с разрешением. У меня есть локальная копия сайта на моем персональном компьютере, и проблема там также существует. Однако при чистой установке файлы действительно удаляются. На моем проблемном сайте файлы не удаляются даже после удаления всего узла, к которому они прикреплены. Любые другие идеи, которые могут быть причиной этого в моей настройке Drupal. Я предполагаю, что это должен быть модуль ...
Борина Дитчева
По крайней мере, вы сузили его до установки. Какие модули вы используете? Любые пользовательские / fork / dev модули?
Арам Бояджян
0

Мне не повезло с удалением старых ревизий или сохранением узлов без их прикрепленных файлов и возвращением. Это единственные вещи, которые всегда работают:

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

Я абсолютно ненавижу второй вариант, поэтому я здесь ищу другое решение.

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

Wray Bowling
источник
Я начал тикет об этом давным-давно: drupal.org/node/1816584 . Присоединяйтесь, если хотите, и, возможно, может быть более серьезное обсуждение этого вопроса, если есть дополнительные голоса.
Борина Дитчева
0

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

Чтобы все работало гладко, добавьте vid узла как папку к пути загрузки файла. Обычно я делаю что-то вроде.

Путь к папке = assets / [узел: nid] - [узел: заголовок] / [узел: vid]

Да, это уродливые длинные папки с безумием подпапок, но вы действительно легко можете найти файлы по идентификатору узла или названию, а затем подпапка предотвращает конфликты имен, так что вы можете хранить много версий одного и того же файла с одинаковым именем. Затем вы можете удалить старые ревизии, если хотите очистить пространство.

Эйдан Фостер
источник