Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: открытие файла doc с длинным русским названием

Сообщения:  [1-10]   [11-11] 

 
 автор: larush   (18.04.2008 в 12:08)   письмо автору
 
   для: vitali   (18.04.2008 в 12:00)
 

спасибо, пошел пробовать. Возращаясь к вопросу транслитерации- вот ссылка., может кому пригодится
http://www.softholm.com/sources/translat.html

   
 
 автор: vitali   (18.04.2008 в 12:00)   письмо автору
 
   для: larush   (18.04.2008 в 11:34)
 

Я Вашу ситуацию разрулил так.
У меня пользователи своди документы любого mimo-типа размещают в соответствующие каталоги (естественно в том числе имя файла м.б. на русской кодировке) как по ftp (работая в Word, Excel, Visio и т.д. могут и по http (Сайты внутренние, поэтому безопасники всвоими методами борятся за чистоту интранета) На сервере кодировка ISO-8859-5. кодировку документа и имени файла добываю сам.
Вообщем см. скрипт может чем поможет:

//формируем список ссылок (имен файлов) для раскрытия их по клику
#$f_info - указатель на текущую строку (full_path,fname,name_dir,time) массива
foreach ($tmp_arr_i as $f_info)
  {
   $full_way_file = $f_info['full_path']; //полный путь к файлу
   $full_nm_file = $f_info['fname'];   // запоминаем только полное имя файла
   $time = $f_info['time']; //дата создания или модификации файла
   if (is_file("$full_way_file/$full_nm_file"))
    {
     $str_cont = strtolower(trim(`file -i -b '$full_way_file/$full_nm_file'`)); //тип-файла по контексту
     $str_cont = str_replace('iso-8859-1', 'iso-8859-5', $str_cont); //уточняем кодировку
     $content =  explode(';', str_replace('charset=', '', $str_cont)); //mimo-тип-файла, кодировка
     if (preg_match("/^(.*)\.(.*)$/", $full_nm_file, $matches)) //выделяем префикс и расширение
      { //в имени файла есть конструкция ('имя файла'.'расширение')
        $nm_pref = $matches[1]; //Имя файла - префикс (от начала до(.))
        $nm_suf =  strtolower($matches[2]); //расширение (суфикс) (после последней (.))
      }
     else
      {//в имени файла нет конструкции ('имя файла'.'расширение')
        $nm_pref = $full_nm_file;
        $nm_suf = '';
      }
### echo "mimo-тип файла $content[0], кодировка $content[1], расширение $nm_suf";
     $tmp_name = "$full_way_file/$full_nm_file"; //полный путь к файлу
# Отображаем или русское название файла или для html-файла содержимое <title>
     if ($content[0] == 'text/html' and ($nm_suf == 'html' or $nm_suf == 'htm')) #html-файл,Открываю
      {
       $f_str = '';
       $file = fopen("$tmp_name",'r');
       while(!feof($file))
        {
         $f_tmp_str = fgets($file,4096);
         $f_tmp_str = str_replace("\n"," ",$f_tmp_str); //сливаем в одну стр
         $f_tmp_str = str_replace("'","\"",$f_tmp_str); //борьба с кавычками
         $f_str .= $f_tmp_str;
        }
       fclose($file);
       eregi("<head>(.+)</head>", $f_str, $m_head); //Выделил фрагмент тегов
       $f_str = $m_head[1]; //Выделил meta, title для => анализа
       if (strlen($f_str) <= 0)
        {
          print "Файл $tmp_name неверно оформлен, сообщите куратору сайта<br>"; continue;
        }
       $met_tags = get_meta_data($f_str); //идем за кодировкой файла
//echo '<pre>массив met_tags:'; print_r($met_tags); echo '-!</pre>';

       $show_fname = $met_tags['title']; //Заголовок файла
       if (strtolower($met_tags['charset']) != "iso-8859-5") //тип кодировки не ISO
        {
         $show_fname = iconv($met_tags['charset'], "ISO-8859-5", $show_fname); //В 'название ссылки' подставляем html-заголовок документа в iso-кодировке
        }
      } // Закончили разбор HTML-документа
     else
      {
       if ($content[1] == '') $content[1] = 'windows-1251'; //если кодировка неопр, то пусть windows
       if ($content[1] != 'iso-8859-5' )
       $show_fname = iconv("$content[1]", "ISO-8859-5", $nm_pref); // В 'название ссылки' подставляем конвертированное имя файла (файл - не HTML-документ)
      }
     if (!isset($show_fname) or $show_fname == '') $show_fname = $full_nm_file;
     if (strlen($show_fname) > $dl_nmfile) { $show_fname = substr($show_fname, 0, $dl_nmfile+1)."..."; } //Обрезаем имя файла по $dl_nmfile и добавляем ...
     print "<a href=\"javascript:sub_vw_file('$full_nm_file', '".$f_info["name_dir"]."', '".$nm_ifr."');\" ><span style='color: red'> ".Date("d.m", $f_info["time"])."</span> <span style='font-size:80%'>$show_fname</span></a> <br>\n"; //формируем ссылки
    }
  } //конец foreach-формирователя списка ссылок (имен файлов)

   
 
 автор: larush   (18.04.2008 в 11:34)   письмо автору
 
   для: Valick   (18.04.2008 в 11:27)
 

>Сканировать директорию или запрос к БД - что быстрее?
>Лично у меня готовых решений нет, но то что они есть я уверен на 90%)
ну а если файл каким-то образом был удален с диска а в базе остался ? Нагрузка на сайт небольшая, поэтому вопрос производительности не учитываю.

   
 
 автор: larush   (18.04.2008 в 11:33)   письмо автору
 
   для: elenaki   (18.04.2008 в 11:26)
 

>если не фильтровать спецсимволы, то может случиться, что вам и кавычки в URL засунут
>и слеши и все, что угодно. банальным urlencode(), urldecode() не пробовали пользоваться?
да это внутренний сайт.. так что о безопасности не беспокоюсь...а что даст urldecode ? Ведь файл открывается уже не скртиптом...
подскажите плиз, вариант с преобразованием русского название в кирилицу, а то с PREG не дружу

   
 
 автор: Valick   (18.04.2008 в 11:27)   письмо автору
 
   для: larush   (18.04.2008 в 11:17)
 

Сканировать директорию или запрос к БД - что быстрее?
Лично у меня готовых решений нет, но то что они есть я уверен на 90%)

   
 
 автор: elenaki   (18.04.2008 в 11:26)   письмо автору
 
   для: larush   (18.04.2008 в 11:17)
 

если не фильтровать спецсимволы, то может случиться, что вам и кавычки в URL засунут
и слеши и все, что угодно. банальным urlencode(), urldecode() не пробовали пользоваться?

   
 
 автор: larush   (18.04.2008 в 11:17)   письмо автору
 
   для: Valick   (18.04.2008 в 11:10)
 

да я копирую файл в определенную директорию, закрепленную за данным номером договора (по ID) а когда пользователь проссматривает договор, то сканирую ее и выводу список файлов, которые он прикрепил к данному договору. Поэтому менять названия и не хочу, пока не рассматриваю вопрос хранения названий и линков в БД, мне кажется что мое решение "железобетонное", тока вот с сылками пока не разобрался. Если на след. неделе не разберусь, то придется рассматривать и работу с БД. Есть-ли готовые решения ? Буду признателен если кто кинет ссылку на статью на форуме.

   
 
 автор: Valick   (18.04.2008 в 11:10)   письмо автору
 
   для: larush   (18.04.2008 в 11:02)
 

А что вам мешает делать это всё через базу? В базе сохраняется полное имя файла и выданный при загрузке идентификатор под которым и храниться файл на сервере. Идея стара как мир)

   
 
 автор: elenaki   (18.04.2008 в 11:09)   письмо автору
 
   для: larush   (18.04.2008 в 11:02)
 

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

   
 
 автор: KPETuH   (18.04.2008 в 11:07)   письмо автору
 
   для: larush   (18.04.2008 в 11:02)
 

судя по всему вас проблема с кодировками utf-8 и cp1251, а вообщето не рекомендуется юзать кирилицу в урле...

   

Сообщения:  [1-10]   [11-11] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования