А проблема была в том, что в никсах, как правило, используется кодировка utf-8 (у меня именно так), а в винде cp1251. Вроде бы, какое это имеет значение? Да вот дело в том, что база тоже в кодировке uft-8. Ну и что? А то, что файлы, которые прикрепляют к заявкам, хранятся не в базе на на диске, а "ссылки" на эти файлы в базе. А так как кодировки разные, то GLPI не может найти файлы на диске, если в имени файла содержатся символы с кодом больше 128 или, проще говоря, символы кириллицы.
Решений в голове назрело 2:
1. Перекодировать БД в cp1251
2. Подправить PHP-код, чтобы перед отдачей файла исправлялась кодировка, т.е. перекодировывать из утф в сипи
Я выбрал второй, т.к. как реализовать первый не нашел, к тому же с эскьюэль особо не знаком, да и читал где-то когда-то, что в случае перекодировывания будут какие-то глюки. Да и времени особо-то и не было на изучение этого вопроса. Поэтому и расскажу про второй способ, т.е. правку кода.
Для второго способа у меня вышло аж 2 решения, начну с более простого, которое мне подсказал Hubbitus.
1. Чтобы GLPI отдавал файлы с русскими именами нужно отредактировать файл %GLPI_DIR%\front\document.send.php. А именно, надо найти строки
if ($send&&file_exists(GLPI_DOC_DIR."/".$_GET["file"]))которые в самом низу файла и заменить их на
sendFile(GLPI_DOC_DIR."/".$_GET["file"],$splitter[1]);
if ($send&&file_exists(GLPI_DOC_DIR."/".iconv('UTF-8', 'CP1251', $_GET["file"])))Тут функция iconv тупо перекодировывает все, что ей скармливают из utf-8 в cp1251.
sendFile(GLPI_DOC_DIR."/".iconv('UTF-8', 'CP1251', $_GET["file"]),$splitter[1]);
2. Второй способ более универсален, т.к. сам определяет кодировку строки и перекодировывает ее в cp1251. И так, нам нужно отправиться в гости к Юрию Попову и забрать у него php-библиотечку a.charset.php (на этой же страничке вы и узнаете все про нее и скачаете) и положить ее в папку %GLPI_DIR%\inc\. Теперь в файле %GLPI_DIR%\front\document.send.php в самом начале, после первого инклюда (у меня это строка 40) нужно добавить:
include (GLPI_ROOT . "/inc/a.charset.php");А в конце этого файла нужно сделать тоже самое, что в первом варианте, только те строки заменить на:
if ($send&&file_exists(GLPI_DOC_DIR."/".charset_x_win($_GET["file"])))Все :) Теперь GLPI без проблем отдает файлы с русскими именами.
sendFile(GLPI_DOC_DIR."/".charset_x_win($_GET["file"]),$splitter[1]);
Осталось только одно НО... :(
К сожалению, я пока не нашел, как добиться, чтобы GLPI принимал файлы с русскими именами.
Как только найду, обязательно сразу напишу след. пост.
ЗЫЖ Сменил версию GLPI на 0.72.1, поэтому заново пришлось править скрипты, чтобы добавить свои статусы для заявок, о чем я писал в посте "GLPI: Добавляем свои статусы для заявок". Поэтому прикрепил к этому посту архив, в который положил исправленные скрипты, а так же файлы document.send.php и a.charset.php.
Информация с сайта http://angel2s2.blogspot.com/. Если Вы читаете информацию на другом сайте, пожалуйста свяжитесь с автором сайта http://angel2s2.blogspot.com/.
4 коммент.:
1 вопрос, а нафига перекидывать-то на win2003? если все под линухом работает?
-=AmoN=-
По некоторым техническим причинам. К тому же этот сервак на никсах был поднят на виртуальной машине, а хостовая система била этой самой виндой 2003. Надо было избавиться от виртуальной машине. В общем тут долго детали рассказывать, т.к. тут целая цепочка событий.
спасибо! пригодится. особенно, учитывая, что на винде сидим
Всегда пожалуйста :)
Отправить комментарий