Папка с загрузками растёт незаметно.

Сначала там несколько обложек. Потом появляются изображения из черновиков, старые версии файлов, удалённые статьи, временные копии и картинки, которые когда-то тестировались в редакторе.

Через некоторое время уже непонятно, какие файлы используются, а какие просто занимают место.

Для AllBlog я решил сделать отдельную проверку загрузок.

Почему нельзя просто удалить всё старое

Дата файла почти ничего не говорит о его полезности.

Старая фотография может до сих пор стоять в популярной статье. Новый файл может оказаться временной копией, которая нигде не используется.

Также ссылка на изображение может находиться:

  • в тексте статьи;
  • в обложке;
  • в галерее;
  • в настройках страницы;
  • в блоке автора;
  • в старом формате данных;
  • внутри Markdown или HTML.

Поэтому автоматическое правило «удалить всё старше года» для блога слишком опасно.

Что должен делать сканер

Я разделил задачу на несколько этапов.

1. Собрать реальные файлы

Система проходит по разрешённым каталогам загрузок и получает:

  • путь;
  • имя;
  • размер;
  • тип;
  • дату изменения.

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

2. Собрать ссылки из контента

Дальше нужно найти все упоминания файлов в базе и настройках.

Одна и та же картинка может быть записана как:

/uploads/2026/photo.webp
https://allblog.ru/uploads/2026/photo.webp
uploads/2026/photo.webp

Перед сравнением пути приходится нормализовать.

3. Сопоставить данные

После сравнения появляются несколько групп:

  • файл найден и используется;
  • файл существует, но ссылка не найдена;
  • ссылка есть, но самого файла нет;
  • один файл используется в нескольких местах;
  • возможный дубликат.

Именно такой отчёт полезнее одной кнопки «Очистить».

Почему первый запуск ничего не показывал

В инструментах админки часто встречается неприятная ситуация: процесс выполнился, но интерфейс не получил ожидаемые данные.

Причиной может быть:

  • неправильный формат ответа;
  • необработанное предупреждение;
  • отсутствующий ключ массива;
  • ошибка JavaScript;
  • слишком раннее завершение запроса;
  • проблема с правами доступа.

Пользователь видит только пустой блок и не понимает, запускалось ли сканирование вообще.

Поэтому для таких операций особенно важны явные состояния:

Подготовка
Сканирование
Найдено файлов
Сопоставление
Готово
Ошибка

Даже техническая админка должна объяснять, что сейчас происходит.

Не удалять без подтверждения

Файл, который система считает неиспользуемым, всё равно может понадобиться.

Например, он может быть:

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

Поэтому безопасный сценарий выглядит так:

  1. показать найденные кандидаты;
  2. дать открыть файл;
  3. показать размер и путь;
  4. позволить выбрать отдельные элементы;
  5. сначала переместить в корзину или карантин;
  6. удалять окончательно только после проверки.

Отдельная проблема — отсутствующие файлы

Сломанная ссылка в статье хуже лишнего файла на диске.

Она портит внешний вид страницы и часто остаётся незамеченной, пока кто-то не откроет старый материал.

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

Так можно восстановить изображение из резервной копии или удалить битую ссылку из текста.

Проверка безопасности

Любая работа с файловой системой требует осторожности.

Нужно защищаться от:

  • выхода за разрешённую директорию;
  • подмены пути через ../;
  • удаления системных файлов;
  • обработки символических ссылок;
  • неожиданных расширений;
  • слишком больших директорий;
  • случайного запуска несколькими процессами.

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

Итог

Порядок в загрузках — это не массовое удаление файлов.

Хороший инструмент сначала собирает факты, показывает связи и только потом предлагает действие.

Для личного блога такой сканер кажется избыточным ровно до момента, когда папка загрузок становится достаточно большой, а ручная проверка — достаточно страшной.