Web Developer On1x.com Игры как увлечение Видео–игры как хобби и увлечение. Новости игровой индустрии. Блог про видео–игры.
PAX East 2013, отчетО повторении одних и тех же квестов в играхВопросы и ответы по анонсу PlayStation 4

Чиним кривые имена файлов в кириллице после переноса сайта

Частая проблема - сайт перенесли, а имена файлов сломались (естественно, виновата кодировка кириллических символов). Вручную ходить и менять каждый файл - не вариант. Поэтому для исправления таких проблем напишем простой, но эффективный инструмент на 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
Собственные проекты:
GameCommunity.ru, GameSocial.Net (TV), ART-Talk.ru, Дград.инфо
On1x blog
my ip