PHP скрипт для решения проблем с кодировкой бекапа VestaCP
Столкнулся с проблемой на одном из своих серверов. На этот раз сайт после неудачного созданного бекапа на русских словах поменял кодировку с UTF-8 на WIN-1251. Бывает и такое, на данном серваке установлена VestaCp, а она любит приподносить сюрпризы. Самое обидное - в наличии 10 тысяч файлов и папок и не очень то и хотелось вручную убивать неделю жизни на восстановление нормальных имён файлов. Я очень полюбил панельку управления от VestaCP, но я устал каждый 3 месяца делать переустановку операционной системы и начисто заново устанавливать весту.
Столкнулся с проблемой на одном из своих серверов. На этот раз сайт после неудачного созданного бекапа на русских словах поменял кодировку с UTF-8 на WIN-1251. Бывает и такое, на данном серваке установлена VestaCp, а она любит преподносить сюрпризы. Самое обидное - в наличии 10 тысяч файлов и папок и не очень то и хотелось вручную убивать неделю жизни на восстановление нормальных имён файлов. Я очень полюбил панельку управления от VestaCP, но я устал каждый 3 месяца делать переустановку операционной системы и начисто заново устанавливать весту.
Имеем файлы с кракозябрами и их надо массово как-то пофиксить. Содержимое файлов трогать не будет, так как с ними всё в порядке (у меня это фотографии товаров), а вот имя файлов нужно будет заменить и желательно очень быстро. Напишем скрипт. Так как у меня довольно много папок и в каждой папке по 20 фотографий я буду делать всё аккуратно без рекурсии, по каждой папке в отдельности.
Название папки (у меня это ID товара) буду передавать в GET параметре прямо в браузере:
$n = $_GET["n"];
Далее укажу местоположение всех папок в директории на сервере с учётом вышеупомянутого параметра GET:
$papka = "upload/project/$n/";
Открываем папку и назначаем ей переменную:
$dir = opendir($papka);
Пробегаемся циклом и получаем список всех файлов:
while (false !== ($file = readdir($dir))) { ... }
Нужно будет отсечь из списка ненужные пункты, а именно "." и ".." (выход на папку выше или выйти в корень):
if ($file != "." && $file != "..") { ... }
Сама конвертация кодировок помещается в одну небольшую строку, в которой нужно указать местоположение файла со старым названием и указать местоположение файла, но уже с новым названием. Очевидно, что местоположение должно быть одинаковым, разница должна быть в имени файла.
$text = mb_convert_encoding($file, 'windows-1251', 'UTF-8');
Потом создаём полный путь к файлу путём объединения переменных:
$path = $papka.$file;
остаётся только выполнить две проверки, одна из которых будет проверка существования файла, а вторая проверка успешного завершения переименования файла:
if (file_exists($path)) {
if (rename($path, $papka . $text)) {
echo "Файл $text переименован.";
} else {
echo "Ошибка: Файл $text не был переименован.";
}
} else {
echo "Ошибка: Файл $text не существует.";
}
По сути всё, пришлось помучаться сегодня и сначала искать готовые решения, которые не помогли. Учитесь программировать и находить решения проблем с помощью кода! А готовый код можно будет посмотреть ниже:
<?php $n = $_GET["n"]; $papka = "upload/project/$n/"; $dir = opendir($papka); while (false !== ($file = readdir($dir))) { if ($file != "." && $file != "..") { $text = mb_convert_encoding($file, 'windows-1251', 'UTF-8'); $path = $papka . $file; if (file_exists($path)) { if (rename($path, $papka . $text)) { echo "Файл $text переименован. <br>"; } else { echo "Ошибка: Файл $text не был переименован. <br>"; } } else { echo "Ошибка: Файл $text не существует. <br>"; } } } ?>