imagewebp не принимает путь на кириллице?

99
02 декабря 2020, 19:30

Пишу скрипт по конвертации изображений в .webp. Скрипт конвертирует и кладет рядом с оригиналом изображение в webp. Однако если папка содержит кириллицу, то функция imagewebp не выполняется. Вот код, в чем проблема? спасибо.

function ConvertToWebp($dir) /*В аргумент передаем абсолютный путь каталога*/
{
$absolutDir=$dir;
$results = scandir($absolutDir);/*Возвращает массив с содержанием каталога*/
foreach ($results as $value) {
    if ($value=='.' || $value=='..') {/*игнорируем навигационные символы, которые возвращает scandir*/
        continue;
    }
    if (is_file($absolutDir.$value)) {
        $image=$absolutDir.$value;/*Получаем абсолютную ссылку на файл*/
        $arg=mb_strtolower(substr(strrchr($image, '.'), 1));/*получаем расширение файла в нижнем регистре*/
        if ($arg=='jpg' || $arg=='jpeg') {
            $im=imagecreatefromjpeg($image);/*создает изображение в jpg из файла по ссылке, типо шаблона наверное*/ 
            $infoImage=pathinfo($image);/*атрибуты файла*/
            $nameImage=$infoImage['filename'];/*имя файла без расширения*/
            $absoluteDirForImage=$infoImage['dirname'].'/';/*абсолютная ссылка до файла*/
            $webp=imagewebp($im, $absoluteDirForImage.$nameImage.'.webp');/*конвертация созданного изображения. <абсолютная ссылка до файла><имя файла без расширения><и добавляем расширение .webp>*/
            imagedestroy($im);/*удаляем шаблон изображения*/        
        }
         if ($arg=='png') {
            $im=imagecreatefrompng($image); 
            $infoImage=pathinfo($image);
            $nameImage=$infoImage['filename'];
            $absoluteDirForImage=$infoImage['dirname'].'/';
            $webp=imagewebp($im, $absoluteDirForImage.$nameImage.'.webp');
            imagedestroy($im);      
         }
    }
      if (is_dir($absolutDir.$value)) {
         $dir=pathinfo($absolutDir.$value);
         ConvertToWebp($dir['dirname'].'/'.$dir['filename'].'/');
      }
}
/*profit*/
}
echo ConvertToWebp('/images/testwebp/ппп/');
Answer 1

Если вы используете Apache - это нормально, так как он не умеет работать с названиями файлов/директорий на кириллице. Можете протестировать взяв basename файла название которого на кириллице через скрипт php и получите кракозябры. Просто этому багу как я понимаю много лет => в сети начали появлятся самописные скрипты для взятия названий файлов, но на моем личном опыте - они не работают. Вывод таков - апач не любит кириллицу, так что ищите какие-либо скрипты на замену тем функциям для работы с названиями файлов/директорий в интернете (Если вы используете не apache, то я без понятия).

Answer 2

Всем спасибо за подсказки. Я не понял что произошло, но код начал выполняться по всем папкам, вне зависимости от названия. Саморазрешаемая проблема. Возможно при тестировании что-то напутал с правами на каталог. Ниже рабочий код после небольшого рефакторинга.

function ConvertToWebp($dir) /*В аргумент передаем абсолютный путь каталога*/
{
$absolutDir=$dir;
$results = scandir($absolutDir);/*Возвращает массив с содержанием каталога*/
foreach ($results as $value) {
    if ($value=='.' || $value=='..') {/*игнорируем навигационные символы, которые возвращает scandir*/
        continue;
    }
    if (is_file($absolutDir.'/'.$value)) {
        $image=$absolutDir.'/'.$value;/*Получаем абсолютную ссылку на файл*/
        $arg=mime_content_type($image);/*получаем расширение файла в нижнем регистре*/
        if ($arg=='image/jpeg') {
            $im=imagecreatefromjpeg($image);/*создает изображение из файла по ссылке*/ 
       }
       if ($arg=='image/png') {
          $im=imagecreatefrompng($image); 
       }
       $infoImage=pathinfo($image);/*атрибуты файла*/
       $nameImage=$infoImage['filename'];/*имя файла без расширения*/
       $absoluteDirForImage=$infoImage['dirname'].'/';/*абсолютная ссылка до файла*/
       $webp=imagewebp($im, 
       $absoluteDirForImage.$nameImage.'.webp');/*конвертация созданного изображения. <абсолютная ссылка до файла><имя файла без расширения><и добавляем расширение .webp>*/
       imagedestroy($im);/*удаляем шаблон изображения*/        
       }
      if (is_dir($absolutDir.'/'.$value)) {
         $dir=pathinfo($absolutDir.'/'.$value);
         ConvertToWebp($dir['dirname'].'/'.$dir['filename'].'/');
      }
}
/*profit*/
}
echo ConvertToWebp('/frontend/web/images/testwebp');
READ ALSO
Для знатоков SQL

Для знатоков SQL

Всем добрый день! Интересует вопрос как с помощью SQL запроса можно сделать многомерный массив

119
Проблема с password_verify

Проблема с password_verify

есть проблема при проверке пароля при первой проверке пароля сценарий стопорится на password_verify и урл принимает вид http://site/login?login=admin&password=12345,...

120
Установка ImageMagick на OpenServer

Установка ImageMagick на OpenServer

Кто знает как использовать ImageMagick в OpenServer? Скачал OpenServer вместе с ImageMagick, но при попытке им воспользоваться выдает ошибку Fatal error: Uncaught Error: Class 'Imagick'...

136
Подсказки по местонахождению скрипта в VS Code

Подсказки по местонахождению скрипта в VS Code

Как в VS Code сделать возможность по наведению курсором мыши на какую-либо функцию, объект , чтобы при этом как в sublime text выводилась подсказка...

132