Я пытаюсь написать скрипт, который открывает каталог, сканирует все файлы (изображения) и отображает его на экране, но проблема в том, что он содержит символы в их именах, и scandir не может его обработать.
Это нормально для каталогов, где в их именах нет символов, скрипт работает отлично, но каталоги / файлы с символами в их имени — большая проблема.
Например, у меня есть всего 2 каталога, и все файлы в этих каталогах содержат одинаковые символы в их имени. Один содержит «®», а другой — «™», и каждый отдельный файл (изображение) имеет эти символы в своих именах, например: «Right® screen452217.jpg». Таким образом, переименование каталогов и файлов не вариант, это займет слишком много времени.
Может быть, есть лучший способ, но я делаю это прямо из URL на экране с $ _GET. Сейчас он находится на локальном сервере, я работаю на сервере VertrigoServ WAMP и сценарий выглядит так:
http://127.0.0.1/screenshots/index.php?page=Rights®
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks™
$url = "screens/".$_GET["page"]."";
$scan = scandir($url, SCANDIR_SORT_NONE);
$scaned = array_diff($scan, array('.', '..', 'Thumbs.db'));
foreach($scaned as $shots) {
if ($shots <> "thumbnails") {
echo "<li>".PHP_EOL.
" <img width=\"253\" height=\"158\" src=\"".$url."\\".$shots."\"".
" alt=\"".$shots."\" title=\"".$shots."\".
" </li>".PHP_EOL.PHP_EOL;
}
}
Scandir сообщает об этих ошибках:
The system cannot find the file specified. (code: 2)
failed to open dir: No such file or directory
No such file or directory
array_diff сообщает об этой ошибке:
Argument #1 is not an array
и, наконец, foreach отчет:
Invalid argument supplied for foreach()
Я также пытался изменить кодировку с mb_convert_encoding () а также Iconv (), но не повезло.
Мой лучший результат был после изменения URL, вместо того, чтобы использовать «®» или «™», я использовал Windows-1252 Справочник по кодировке ASCII:
http://127.0.0.1/screenshots/index.php?page=Rights%AE
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks%99
Тогда все прошло без ошибок, но вместо показа изображений «img src» выглядит так:
screens/Rights�\Right�452217.jpg
что по-прежнему проблема, потому что изображения не отображаются. Мне нравится придерживаться Scandir, потому что я уже сделал страницу, но я не могу пройти через эти проблемы с символами. Не могли бы вы мне помочь ?
Это было на самом деле проще, чем я думал. Проблема была в том, что каталог уже был с символами в их именах, поэтому я должен изменить это на Windows-1252 следующим образом:
$page = $_GET["page"];
if (strpos($page, '®')) {$page = str_replace('®', '%AE', $page);}
if (strpos($page, '™')) {$page = str_replace('™', '%99', $page);}
Затем URL-адреса изменяются с:
http://127.0.0.1/screenshots/index.php?page=Rights®
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks™
Для того, чтобы:
http://127.0.0.1/screenshots/index.php?page=Rights%AE
http://127.0.0.1/screenshots/index.php?page=Trade%20Marks%99
Тогда это было просто, просто добавьте кодировку после scandir и одну в foreach:
$url = "screens/".$_GET["page"]."";
$scan = scandir($url, SCANDIR_SORT_NONE);
$scaned = array_diff($scan, array('.', '..', 'Thumbs.db'));
$url = iconv("windows-1252", "UTF-8", $screen_uplay);
foreach($scaned as $shots) {
if ($shots <> "thumbnails") {
$shots = iconv("windows-1252", "UTF-8", $shots);
echo "<li>".PHP_EOL.
" <img width=\"253\" height=\"158\" src=\"".$url."\\".$shots."\"".
" alt=\"".$shots."\" title=\"".$shots."\".
" </li>".PHP_EOL.PHP_EOL;
}
}
Просто как тот. Может быть, есть лучший способ, но это работает для меня, и я в порядке с этим.
Других решений пока нет …