• Сегодня озадачился проблемой, которая появлялась и ранее — в проекте не отображаются картинки с кириллическими названиями! То есть они копируются в папку upload, но висят в медиафайлах пустыми серыми окнами! В самой же папке загрузок кириллические названия преобразуются в «кракозябры»!

    Кроме того обнаружил, что это касается не только кириллицы, но и других символов в названии-например Tromsø — вышеописанная проблема повторяется, а вот Tromsо (последняя буква-латинская «o») — уже отображается как нужно!

    Что с этим делать?

    PS/ Работаю на локальном сервере OpenServer у себя на компьютере!

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    В PHP для Windows есть баг — нельзя задать кодировку для имён файлов. Т.е. файлы с русскими именами в UTF-8 в Windows загружаются некорректно.

    При переносе на хостинг проблема должна решиться.

    Похожая тема: «Проблема с медиафайлами на локальном сервере».

    Автор you_story

    (@you_storymailru)

    Эта проблема встречается во всех версиях PHP? Есть какие-нибудь секреты для обхода этого бага? На другом не вордпрессовском проекте вроде такого не было, хотя проверю сегодня!

    На самом деле имена файлов головная боль, потому что туда много чего попасть может 🙂 и помимо неотображения через http, иногда такие файлы нельзя удалить (кнопка удалить в админке удаляет лишь запись из БД, а сами файлы физически остаются на диске). Также такие плохие файлы потом нельзя удалить даже через терминал простой командой rm потому что имени полного нету, приходится через указание innode удалять 🙂
    Мы с Сергеем обсуждали эту проблему на этом же форуме насчет имен загружаемых файлов. В итоге я написал вот такой пост и штуку, которая решает вышеописанные проблемы https://korobochkin.wordpress.com/2015/01/01/sanitize-filenames/

    Решение сводится к тому, что в именах файлов остаются лишь символы, которые имеют право быть в URL-адресах, а вся кириллица записывается транслитом.

    Автор you_story

    (@you_storymailru)

    Сейчас сделал поиск функции в папке проекта, нашел несколько файлов с этой функцией:

    в папках плагинов:
    -wp-content/plugins/buddypress/bp-forums/
    -wp-content/plugins/buddypress/bp-groups/
    -wp-content/plugins/buddypress/bp-members/
    -wp-content/plugins/buddypress/bp-docs/
    -wp-content/plugins/buddypress/bp-media/

    в папках некоторых тем, а также другие файлы:
    -wp-content/includes/class-wp-xmlrpc-server.php
    -wp-content/includes/formatting.php
    -wp-content/includes/functions.php

    Вопрос: какой файл и как изменять, или просто создать файл functions.php в папке дочерней темы и написать там только одну предложенную тобой функцию? имя функции какое задавать, так как в твоем варианте ты ее назвал — function kolya_korobochkin_sanitize_file_name?

    А что ты именно искал? sanitize_file_name — это фильтр, а не функция. Соответственно тебе нужно взять код моей функции, название можно изменить. И прицепить ее к выше упомянутому фильтру:

    add_filter ('sanitize_file_name', 'kolya_korobochkin_sanitize_file_name', 99, 2);

    Где именно это сделать неважно: в дочерней теме, отдельным плагином или через MU Plugins. Я использую последний вариант для большинства изменений на своем сайте.

    require WPMU_PLUGIN_DIR . '/selena-network/filenames/inc/plugin.php';
    add_filter ('sanitize_file_name', 'kolya_korobochkin_sanitize_file_name', 99, 2);
    Автор you_story

    (@you_storymailru)

    если говорить о варианте с дочерней темой, то какая должна быть последовательность действий? где именно, в каком файле и какую последовательность кода писать?

    Очевидно в functions.php. Скопировать функцию и add_filter

    Автор you_story

    (@you_storymailru)

    ну получается что я в корневой папке дочерней темы создаю файл functions.php, куда вставляю такой вот код:

    add_filter ('sanitize_file_name', 'parnas_sanitize_file_name', 99, 2);
    
    function parnas_sanitize_file_name ($name, $original_name) {
    	$chars_table = array (
    		/*
    		 * Таблица взята из плагина Filenames to latin
    		 * http://wordpress.org/plugins/filenames-to-latin/
    		 * Версия 2.0
    		 */
    		// Cyrillic alphabet
    		'А' => 'a', 'Б' => 'b', 'В' => 'v', 'Г' => 'g', 'Д' => 'd',
    		'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
    
    		'Е' => 'e', 'Ж' => 'zh', 'З' => 'z', 'И' => 'i', 'Й' => 'j',
    		'е' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'j',
    
    		'К' => 'k', 'Л' => 'l', 'М' => 'm', 'Н' => 'n', 'О' => 'o',
    		'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
    
    		'П' => 'p', 'Р' => 'r', 'С' => 's', 'Т' => 't', 'У' => 'u',
    		'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u',
    
    		'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c', 'Ч' => 'ch', 'Ш' => 'sh',
    		'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh',
    
    		'Щ' => 'shch', 'Ь' => '', 'Ю' => 'ju', 'Я' => 'ja',
    		'щ' => 'shch', 'ь' => '', 'ю' => 'ju', 'я' => 'ja',
    
    		// Ukrainian
    		'Ґ' => 'g', 'Є' => 'ye', 'І' => 'i', 'Ї' => 'yi',
    		'ґ' => 'g', 'є' => 'ye', 'і' => 'i', 'ї' => 'yi',
    
    		// Russian
    		'Ё' => 'yo', 'Ы' => 'y', 'Ъ' => '', 'Э' => 'e',
    		'ё' => 'yo', 'ы' => 'y', 'ъ' => '', 'э' => 'e',
    
    		// Belorussian
    		'Ў' => 'u',
    		'ў' => 'u',
    
    		// German
    		'A' => 'ae', 'O' => 'oe', 'U' => 'ue', '?' => 'ss',
    		'a' => 'ae', 'o' => 'oe', 'u' => 'ue',
    
    		// Polish
    		'A' => 'a', 'C' => 'c', 'E' => 'e', 'L' => 'l', 'N' => 'n',
    		'a' => 'a', 'c' => 'c', 'e' => 'e', 'l' => 'l', 'n' => 'n',
    		'O' => 'o', 'S' => 's', 'Z' => 'z', 'Z' => 'z',
    		'o' => 'o', 's' => 's', 'z' => 'z', 'z' => 'z',
    
    		// Hungarian
    		'O' => 'o', 'U' => 'u',
    		'o' => 'o', 'u' => 'u',
    
    		// Czech
    		'E' => 'e', 'S' => 's', 'C' => 'c', 'R' => 'r', 'Z' => 'z',
    		'e' => 'e', 's' => 's', 'c' => 'c', 'r' => 'r', 'z' => 'z',
    
    		'Y' => 'y', 'A' => 'a', 'E' => 'e', 'D' => 'd', 'T' => 't',
    		'y' => 'y', 'a' => 'a', 'e' => 'e', 'd' => 'd', 't' => 't',
    
    		'N' => 'n', 'U' => 'u', 'U' => 'u',
    		'n' => 'n', 'u' => 'u', 'u' => 'u',
    
    		// Greek alphabet & modern polytonic characters
    		'?' => 'a', '?' => 'v', '?' => 'g', '?' => 'd', '?' => 'e',
    		'?' => 'a', '?' => 'v', '?' => 'g', '?' => 'd', '?' => 'e',
    
    		'?' => 'z', '?' => 'i', '?' => 'th', '?' => 'i', '?' => 'k',
    		'?' => 'z', '?' => 'i', '?' => 'th', '?' => 'i', '?' => 'k',
    
    		'?' => 'l', '?' => 'm', '?' => 'n', '?' => 'x', '?' => 'o',
    		'?' => 'l', '?' => 'm', '?' => 'n', '?' => 'x', '?' => 'o',
    
    		'?' => 'p', '?' => 'r', '?' => 's', '?' => 't', '?' => 'y',
    		'?' => 'p', '?' => 'r', '?' => 's', '?' => 't', '?' => 'y',
    
    		'?' => 'f', '?' => 'ch', '?' => 'ps', '?' => 'o', '?' => 'a',
    		'?' => 'f', '?' => 'ch', '?' => 'ps', '?' => 'o', '?' => 'a',
    
    		'?' => 'e', '?' => 'i', '?' => 'i', '?' => 'o', '?' => 'y',
    		'?' => 'e', '?' => 'i', '?' => 'i', '?' => 'o', '?' => 'y',
    
    		'?' => 'o', '?' => 'i', '?' => 'y',
    		'?' => 'o', '?' => 's', '?' => 'i', '?' => 'i', '?' => 'y', '?' => 'y',
    
    		// Extra all (http:www.atm.ox.ac.ukuseriwicharmap.html)
    		'A' => 'a', 'A' => 'a', 'A' => 'a', 'A' => 'a', 'A' => 'a',
    		'a' => 'a', 'a' => 'a', 'a' => 'a', 'a' => 'a', 'a' => 'a',
    
    		'?' => 'ae', 'C' => 'c', 'E' => 'e', 'E' => 'e', 'E' => 'e',
    		'?' => 'ae', 'c' => 'c', 'e' => 'e', 'e' => 'e', 'e' => 'e',
    
    		'E' => 'e', 'I' => 'i', 'I' => 'i', 'I' => 'i', 'I' => 'i',
    		'e' => 'e', 'i' => 'i', 'i' => 'i', 'i' => 'i', 'i' => 'i',
    
    		'?' => 'd', 'N' => 'n', 'O' => 'o', 'O' => 'o', 'O' => 'o',
    		'?' => 'd', 'n' => 'n', 'o' => 'o', 'o' => 'o', 'o' => 'o',
    
    		'?' => 'x', 'O' => 'o', 'U' => 'u', 'U' => 'u', 'U' => 'u',
    		'?' => 'x', 'o' => 'o', 'u' => 'u', 'u' => 'u', 'u' => 'u',
    
    		'?' => 'p', 'Y' => 'y',
    		'?' => 'p', 'y' => 'y',
    
    		// Other
    		'№' => '', '“' => '', '”' => '', '«' => '', '»' => '',
    		'„' => '', '@' => '', '%' => '', '‘' => '', '’' => '',
    		'' => '', '?' => '', '?' => 'o', '?' => 'a',
    	);
    	$name = remove_accents ($name);
    	$name = strtr ($name, $chars_table);
    	$name = urlencode ($name);
    	// Перезапись % на ничего после urlencode
    	$name = str_replace (array ('%'), '', $name );
    
    	/*
    	 * Проверка на длину файла
    	 * UNIX поддерживает 255 символов в имени максимум.
    	 * Мы обрезаем длину имени файла до 130 символов, как и на wordpress.com,
    	 * WordPress добавляет дополнительные символы в имя файла, например
    	 * image-1000x1000.jpg (поэтому мы резервируем половину возможной длины).
    	 */
    	$info = pathinfo ($name);
    	$name = substr ($info ['filename'], 0, 130);
    	$name .= '.' . $info ['extension'];
    	return $name;
    }

    Правильно я понимаю?

    Да, все верно. Для всех новых файлов имена самих файлов будут проходить через эту штуку. Старые файлы остаются без изменений и надо ручками их удалять, а затем заново загружать. Не забывай что удаление через админку вп не приводит к удалению файлов на диске. Поэтому надо построить список битых файлов и по нему работать.

    Автор you_story

    (@you_storymailru)

    А почему кстати у всемирно известного CMS такие элементарные проблемы как «удаление файлов из папки через админку»? И опять-же как с этим бороться?

    А вот если говорить о вышеизложенной проблеме — чем не подходил описанный тобой плагин filenames-to-latin?

    В большинстве случаев картинки загружают только доверенные люди и они должны сами красиво подписывать файлы, давая им внятные имена. Некоторые плохие символы ВП сам удаляет из имен. При загрузке автарок, например, buddypress дает файлам названия автоматически, полностью затирая оригинальное название на что-то вроде хеша файла. К тому же, как было сказано выше, проблема с кирилическими именами только на виндус серверах, на линуксе все работает, но лично мне не нравится кириллица в адресах. На виндовс сервере и красивые ссылки (permalinks) не получится сделать (у меня не получилось, версия сервера не помню какая была).

    Бороться с помощью установки моего плагина, а кривые существующие файлы поправить руками. Может на виндовс они кстати удалятся нормально через терминал или гуи клиент или даже через админку вордпресса. В любом случае нужно лично проинспектировать. На линуксе у меня такой ад в именах был, что я удалял, указывая innode-файла и только так удалялось. Проблема была еще ив том, что понять где какой файл невозможно, потому что вместо имени знаки ????? отображались.

    Готовые плагины, которых огромное количество, не подходят тем, что они не полностью причесывают имена. Например, в том же filenames to latin нет проверки на длину имени файла и файл не сможет сохраниться. Длина имени файла может получиться больше 255, т. к. некоторые кириллические символы заменяются несколькими английскими буквами. Плюс не забываем, что к имени файла прицепляются размеры картинки (у меня в комментарии это обозначено), что также увеличивает длину строчки. Далее, в имени файла могут прийти Apple Emoji, которые мой плагин также заменит (на буквенный код символа). Короче, в имени файла может прийти абсолютно что угодно, поэтому в моем решении тройная броня, которая точно не должна пропустить плохие символы 🙂

Просмотр 11 ответов — с 1 по 11 (всего 11)

Тема «Проблема при загрузке картинок с именем в кириллице» закрыта для новых ответов.