Чиним кривые имена файлов в кириллице после переноса сайта
Частая проблема - сайт перенесли, а имена файлов сломались (естественно, виновата кодировка кириллических символов). Вручную ходить и менять каждый файл - не вариант. Поэтому для исправления таких проблем напишем простой, но эффективный инструмент на php.
Алгоритм доволно простой. Открыть директорию по определенному пути, относительно скрипта. Прочитать содержимое, предложить исправить каждый. + добавить возможность изменить все файлы в директории сразу.
Естественно, для работы скрипта необходимо пройтись по директориям по ftp и назначить права всем папкам, в которых находятся поврежденные файлы 755, 775 или 777 (последний вариант, чтобы уж наверняка).
Основные моменты - изменение кодировки через mb_convert_encoding, можно и через iconv. Название файлов передавать в base64, в стандартный url кракозябры не пойдут. Иструмент можно улучшать и улучшать, но смысла в этом обычно нет - проблема уже решена. В моем примере убраны проверка на сессию администратора сайта - в каждом случае адаптировать скрипт надо под то окружение, где он необходим.
<?php header ('Content-type:text/html; charset=utf-8'); $path='./upload/'; if($_GET['full_path']){ $path=urldecode($_GET['full_path']); } print 'Путь: '.$path; print ' / <a href="?full_path='.$path.'&repair_all_files=yes">Чинить все файлы</a>'; print '<hr>'; if($_GET['repair_name']){ $old=base64_decode($_GET['repair_name']); $new=mb_convert_encoding($old,'cp-1251','utf-8'); rename($path.$old,$path.$new); print '<p><b>Пробую чинить '.$path.$old.' в '.$path.$new.'</b></p>'; } $dir=opendir($path); while($line=readdir($dir)){ if(is_dir($path.$line)){ print '<p>DIR <a href="?full_path='.$path.$line.'/'.'">'.$line.'</a>'; $repair_name=mb_convert_encoding($line,'cp-1251','utf-8'); print ' / если чинить, будет: '.$repair_name.' / <a href="?full_path='.$path.'&repair_name='.base64_encode($line).'">чинить</a>'; print '</p>'; } else{ if('yes'==$_GET['repair_all_files']){ $old=$line; $new=mb_convert_encoding($old,'cp-1251','utf-8'); rename($path.$old,$path.$new); } print '<p>'.$line; $repair_name=mb_convert_encoding($line,'cp-1251','utf-8'); print ' / если чинить, будет: '.$repair_name.' / <a href="?full_path='.$path.'&repair_name='.base64_encode($line).'">чинить</a>'; print '</p>'; } } closedir($dir); if('yes'==$_GET['repair_all_files']){ header('location:?full_path='.$path); } exit;
Мне не очень нравится работать таким сырым кодом, но вполне естественно, что бывают ситуации, когда совершенно нет необходимости делать красиво.
Такие проблемы с кодировкой имен файлов часто возникают при классическом переносе бекапа сайта внутри архивов tar.gz, если вы знаете какие-нибудь консольные рекурсивные чинилки - напишите в комментариях.
Дата записи: 07.11.2014 14:46