Что нового

Удалить не используемые картинки - как? (2 просмотра)

  • Автор темы shalex290485
  • Дата начала
S

shalex290485

Участник
Регистрация
3 Окт 2021
Сообщения
115
Реакции
223
Всем привет. Подскажите, как можно удалить не используемые картинки из папки uploads? Ситуация следующая, в доп поле были загружены картинки, решил удалить доп поле, и как бы проблем нет, оно удалилось и все. Но все картинки, которые были вписаны в эти доп поля, остались в папке uploads.

Как их удалить. Удалить всю папку нет возможности, в ней есть и нужные картинки из других доп полей.

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

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

чуть сложнее, да и вероятность потери данных больше: выборка изображений и файлов из бд, и затем удаляем все картинки, которых нет в этой выборке.
Не знаю, проще или нет, удаляю через ssh по размеру. Получается удаляю все картинки весом больше 25кб.
 
тогда и остальные могут пострадать. вероятность потерь больше.
Вроде не страдает. У меня постеры, они все не больше 20кб. По факту они остаются, а те что больше удаляются.
 
Запрос
SQL:
SELECT xfields FROM dle_post ORDER by id ASC;

теперь собираем функционал, код ниже


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

дела семейные были, иначе раньше ответил бы
 
Последнее редактирование:
спасибо огромное, чуть позже проверю скрипт.
 
Запрос
SQL:
SELECT xfields FROM dle_post ORDER by id ASC;

теперь собираем функционал


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

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

Вот что пишет скрипт:

Удалено 5208 файлов.
Файлы:

Изображение /home/admin/web/site.ru/public_html/uploads/posts/ () удалено!
 
Последнее редактирование модератором:
PHP:
<?php
// Прописываем константы, чтобы скрипты DLE завелись
define('DATALIFEENGINE', true);
define('ROOT', __DIR__);
// Подключаем классы и данные к бд
include_once ROOT . '/engine/classes/mysql.php';
include_once ROOT . '/engine/data/dbconfig.php';
// Делаем выборку, выбираем только доп. поля
$sql_select = 'SELECT xfields FROM dle_post ORDER by id ASC;';
$db->query($sql_select);
// Подсчитываем файлы
$files = 0;
// Создаём массив с удалёнными файлами
$pictures = [];
// Название доп. поля
$xf_name = 'НАЗВАНИЕ ПОЛЯ';
// Проверяем каждую новость
while($row = $db->get_row()) {
   // Распиливаем поля
   $xfs = explode('||', $row['xfields']);
   // Проверяем каждое поле
   foreach($xfs as $x) {
      // Снова распил
      $xf = explode('|', $x);
      // Проверям на нужное поле, название поля вписываем на латинице
      if($xf[0] === $xf_name) {
         // Пилим массив данных о изображениях и создаём новый, если в поле несколько изображений
         $image_data = explode(',', $xf[1]);
         // Разбираем каждое изображение в массиве изображений
         foreach($image_data as $img) {
            // Пилим данные об изображении в новый массив
            $i_data = explode('&#124;', $img);
            // Создаём путь до картинки
            $img_path = ROOT . '/uploads/posts/' . $i_data[0];
            // Проверяем, есть ли такой файл на сервере
            if (!file_exists($img_path)) {
               // Если нет, значит сначала идёт описание к изображению. Заменяем переменную на новый путь
               $img_path = ROOT . '/uploads/posts/' . $i_data[1];
            }
            // Проставляем правильно слеши и прочие неряшливости в пути к файлу
            $img_path = realpath($img_path);
            // Повторно проверяем, есть ли такой файл на сервере
            if (file_exists($img_path)) {
               // Если есть, то вносим в массив данных по удалённым изображений
               $pictures[$img_path] = end($i_data);
               // Пытаемся удалить файл с сервера
               @unlink($img_path);
               // Увеличиваем счётчик удалённых файлов
               $files++;
               
            }
            // Разбираем изображение на пути
            $path_info = pathinfo($img_path);
            // Смотрим в какой папке лежит изображения и сохраняем путь в новую переменную
            $img_dir = dirname(realpath($img_path));
            // Путь до уменьшенной копии
            $thumb_path = $img_dir . '/thumb/' . $path_info['basename'];
            // Путь до средней копии
            $medium_path = $img_dir . '/medium/' . $path_info['basename'];
            // Проверяем, есть ли уменьшенная копия
            if (file_exists($thumb_path)) {
               // Если есть, то вносим в массив данных по удалённым изображений
               $pictures[$thumb_path] = 'Уменьшенная копия';
               // Пытаемся удалить файл с сервера
               @unlink($thumb_path);
               // Увеличиваем счётчик удалённых файлов
               $files++;
            }
            // Проверяем, есть ли средняя копия
            if (file_exists($medium_path)) {
               // Если есть, то вносим в массив данных по удалённым изображений
               $pictures[$medium_path] = 'Средняя копия';
               // Пытаемся удалить файл с сервера
               @unlink($medium_path);
               // Увеличиваем счётчик удалённых файлов
               $files++;
            }
         }
      }
   }
}
// Прощаемся с подключением бд
$db->free();
// Выводим статистику, сколько файлов удалено и каждое изображение на новой строке с размеров файла
echo "Удалено <b>{$files}</b> файлов.<br><b>Файлы</b>:<br><br>";
foreach ($pictures as $pic => $size) echo "Изображение {$pic} ({$size}) удалено!<br>";

исправил, забыл создать разбивку массива
1643359014409



Удаляет так же уменьшенные копии
 
Последнее редактирование:
PHP:
<?php
// Прописываем константы, чтобы скрипты DLE завелись
define('DATALIFEENGINE', true);
define('ROOT', __DIR__);
// Подключаем классы и данные к бд
include_once ROOT . '/engine/classes/mysql.php';
include_once ROOT . '/engine/data/dbconfig.php';
// Делаем выборку, выбираем только доп. поля
$sql_select = 'SELECT xfields FROM dle_post ORDER by id ASC;';
$db->query($sql_select);
// Подсчитываем файлы
$files = 0;
// Создаём массив с удалёнными файлами
$pictures = [];
// Название доп. поля
$xf_name = 'НАЗВАНИЕ ПОЛЯ';
// Проверяем каждую новость
while($row = $db->get_row()) {
   // Распиливаем поля
   $xfs = explode('||', $row['xfields']);
   // Проверяем каждое поле
   foreach($xfs as $x) {
      // Снова распил
      $xf = explode('|', $x);
      // Проверям на нужное поле, название поля вписываем на латинице
      if($xf[0] === $xf_name) {
         // Пилим массив данных о изображениях и создаём новый, если в поле несколько изображений
         $image_data = explode(',', $xf[1]);
         // Разбираем каждое изображение в массиве изображений
         foreach($image_data as $img) {
            // Пилим данные об изображении в новый массив
            $i_data = explode('&#124;', $img);
            // Создаём путь до картинки
            $img_path = ROOT . '/uploads/posts/' . $i_data[0];
            // Проверяем, есть ли такой файл на сервере
            if (!file_exists($img_path)) {
               // Если нет, значит сначала идёт описание к изображению. Заменяем переменную на новый путь
               $img_path = ROOT . '/uploads/posts/' . $i_data[1];
            }
            // Проставляем правильно слеши и прочие неряшливости в пути к файлу
            $img_path = realpath($img_path);
            // Повторно проверяем, есть ли такой файл на сервере
            if (file_exists($img_path)) {
               // Если есть, то вносим в массив данных по удалённым изображений
               $pictures[$img_path] = end($i_data);
               // Пытаемся удалить файл с сервера
               @unlink($img_path);
               // Увеличиваем счётчик удалённых файлов
               $files++;
             
            }
            // Разбираем изображение на пути
            $path_info = pathinfo($img_path);
            // Смотрим в какой папке лежит изображения и сохраняем путь в новую переменную
            $img_dir = dirname(realpath($img_path));
            // Путь до уменьшенной копии
            $thumb_path = $img_dir . '/thumb/' . $path_info['basename'];
            // Путь до средней копии
            $medium_path = $img_dir . '/medium/' . $path_info['basename'];
            // Проверяем, есть ли уменьшенная копия
            if (file_exists($thumb_path)) {
               // Если есть, то вносим в массив данных по удалённым изображений
               $pictures[$thumb_path] = 'Уменьшенная копия';
               // Пытаемся удалить файл с сервера
               @unlink($thumb_path);
               // Увеличиваем счётчик удалённых файлов
               $files++;
            }
            // Проверяем, есть ли средняя копия
            if (file_exists($medium_path)) {
               // Если есть, то вносим в массив данных по удалённым изображений
               $pictures[$medium_path] = 'Средняя копия';
               // Пытаемся удалить файл с сервера
               @unlink($medium_path);
               // Увеличиваем счётчик удалённых файлов
               $files++;
            }
         }
      }
   }
}
// Прощаемся с подключением бд
$db->free();
// Выводим статистику, сколько файлов удалено и каждое изображение на новой строке с размеров файла
echo "Удалено <b>{$files}</b> файлов.<br><b>Файлы</b>:<br><br>";
foreach ($pictures as $pic => $size) echo "Изображение {$pic} ({$size}) удалено!<br>";

исправил, забыл создать разбивку массива
Посмотреть вложение 950



Удаляет так же уменьшенные копии
Что то не хочет у меня работать. Пишет:
удалено 0 файлов.
Файлы:

и все.

доп поле в $xf_name = 'НАЗВАНИЕ ПОЛЯ'; прописал. Вроде только в одном месте надо прописать.
 
да

тогда, в каком виде сохраняются изображения? я сделал только для типа галереи и одиночного изображения
Доп поле «несколько строк» с подключённым редактором. Картинки загружались через парсер кинопоиска. По идеи они загружались обычно и в доп поле просто прописывались. Вроде так реализовано.
 
Доп поле «несколько строк». Картинки загружались через парсер кинопоиска. По идеи они загружались обычно и в доп поле просто прописывались. Вроде так реализовано.
с этого и надо было начинать, я же не ванга, чтобы гадать... мне нужна более подробная информация. как выглядит строка с доп. полем? как заполнялось поле?
 

Вложения

  • 021FDBEA-C507-4EE5-B89A-E36685D89E16.jpeg
    021FDBEA-C507-4EE5-B89A-E36685D89E16.jpeg
    559.8 КБ · Просмотры: 10
с этого и надо было начинать, я же не ванга, чтобы гадать... мне нужна более подробная информация. как выглядит строка с доп. полем? как заполнялось поле?
По идеи картинки загружаются через панель bbcode, как вручную когда загружаешь. Я это так понимаю, картинки находятся в uploads, как и в скрипте прописано, то есть стандартно. А в доп поле по идеи просто выводятся ссылки для отображения на сайте. Могу в личку скинуть доступ к сайту, что бы вживую увидели.
 
По идеи картинки загружаются через панель bbcode, как вручную когда загружаешь. Я это так понимаю, картинки находятся в uploads, как и в скрипте прописано, то есть стандартно. А в доп поле по идеи просто выводятся ссылки для отображения на сайте. Могу в личку скинуть доступ к сайту, что бы вживую увидели.
а как выглядит это в самой базе данных? мне нужна строка из бд.
 
а как выглядит это в самой базе данных? мне нужна строка из бд.
Код:
name|Лес призраков||original_name|The Forest||year|2016||year_all|2016||films|2016||country|США||c_films|США||actors|Натали Дормер, Оуэн Мэкен, Стефани Вогт, Осаму Танпопо, Ясуо Тобисима, Ибуки Канеда, Акико Ивасе, Кикуо Ичикава, Норико Сакура, Йозеф Аоки||director|Джейсон Зада||slogan|«Каждый приходит сюда в поиске выхода»||genre|ужасы, триллер, детектив||g_films|ужасы, триллер, детектив||age|зрителям, достигшим 16 лет||age_alt|16+||studio|Lava Bear Films||studios|Lava Bear Films||time|1 час 33 минуты||time_alt|93 мин. / 01:33||premiere_world|7 января 2016||premiere_rus|14 января 2016||mpaa|детям до 13 лет просмотр не желателен||kinopoisk|5.252||kinopoisk_golosa|19405||imdb|4.8||imdb_golosa|41789||date_rating|1640953123||kp_id|817679||kp_id_2|817679||keywords|ужасы, триллер, детектив||trailer|https://www.youtube.com/embed/n6O9W01XVAc||poster|http://site.ru/uploads/posts/2016-08/1472402147-423018997-les-prizrakov.jpg||screen|<!--TBegin:http://site.ru/uploads/posts/2016-08/1472402149-41441921-les-prizrakov-1.jpg&#124;--><a href="http://site.ru/uploads/posts/2016-08/1472402149-41441921-les-prizrakov-1.jpg" class="highslide" target="_blank" rel="noopener external noreferrer"><img src="http://site.ru/uploads/posts/2016-08/thumbs/1472402149-41441921-les-prizrakov-1.jpg" style="max-width:100%;" alt=""></a><!--TEnd--><!--TBegin:http://site.ru/uploads/posts/2016-08/1472402151-1127737570-les-prizrakov-2.jpg&#124;--><a href="http://site.ru/uploads/posts/2016-08/1472402151-1127737570-les-prizrakov-2.jpg" class="highslide" target="_blank" rel="noopener external noreferrer"><img src="http://site.ru/uploads/posts/2016-08/thumbs/1472402151-1127737570-les-prizrakov-2.jpg" style="max-width:100%;" alt=""></a><!--TEnd--><!--TBegin:http://site.ru/uploads/posts/2016-08/1472402152-61572751-les-prizrakov-3.jpg&#124;--><a href="http://site.ru/uploads/posts/2016-08/1472402152-61572751-les-prizrakov-3.jpg" class="highslide" target="_blank" rel="noopener external noreferrer"><img src="http://site.ru/uploads/posts/2016-08/thumbs/1472402152-61572751-les-prizrakov-3.jpg" style="max-width:100%;" alt=""></a><!--TEnd--><!--TBegin:http://site.ru/uploads/posts/2016-08/1472402153-14561617-les-prizrakov-4.jpg&#124;--><a href="http://site.ru/uploads/posts/2016-08/1472402153-14561617-les-prizrakov-4.jpg" class="highslide" target="_blank" rel="noopener external noreferrer"><img src="http://site.ru/uploads/posts/2016-08/thumbs/1472402153-14561617-les-prizrakov-4.jpg" style="max-width:100%;" alt=""></a><!--TEnd--><!--TBegin:http://site.ru/uploads/posts/2016-08/1472402155-1566164340-les-prizrakov-5.jpg&#124;--><a href="http://site.ru/uploads/posts/2016-08/1472402155-1566164340-les-prizrakov-5.jpg" class="highslide" target="_blank" rel="noopener external noreferrer"><img src="http://site.ru/uploads/posts/2016-08/thumbs/1472402155-1566164340-les-prizrakov-5.jpg" style="max-width:100%;" alt=""></a><!--TEnd--><!--TBegin:http://site.ru/uploads/posts/2016-08/1472402156-833718112-les-prizrakov-6.jpg&#124;--><a href="http://site.ru/uploads/posts/2016-08/1472402156-833718112-les-prizrakov-6.jpg" class="highslide" target="_blank" rel="noopener external noreferrer"><img src="http://site.ru/uploads/posts/2016-08/thumbs/1472402156-833718112-les-prizrakov-6.jpg" style="max-width:100%;" alt=""></a><!--TEnd-->||kachestvo|HD 1080p||ozvuchka|Дублированный||kp_id_parser|817679||videocdn|//3234.videocdn.ca/owSibkIukk4c/movie/527||hdvb|https://vid1584644753.vb17109nadiapattel.pw/movie/ef9a1cc3ceba741e83f76fb50591acf6/iframe||kollaps|https://api1638182040.synchroncode.com/embed/movie/28010||ozvuchka_moonwalk|Рус. Дублированный||studios_moonwalk|Рус. Дублированный||kollaps_id|28010
 
Последнее редактирование:

Пользователи, просматривающие данную тему

Верх