|
|
|
|
|
для: vitali
(18.04.2008 в 12:00)
| | спасибо, пошел пробовать. Возращаясь к вопросу транслитерации- вот ссылка., может кому пригодится
http://www.softholm.com/sources/translat.html | |
|
|
|
|
|
|
|
для: 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-формирователя списка ссылок (имен файлов)
|
| |
|
|
|
|
|
|
|
для: Valick
(18.04.2008 в 11:27)
| | >Сканировать директорию или запрос к БД - что быстрее?
>Лично у меня готовых решений нет, но то что они есть я уверен на 90%)
ну а если файл каким-то образом был удален с диска а в базе остался ? Нагрузка на сайт небольшая, поэтому вопрос производительности не учитываю. | |
|
|
|
|
|
|
|
для: elenaki
(18.04.2008 в 11:26)
| | >если не фильтровать спецсимволы, то может случиться, что вам и кавычки в URL засунут
>и слеши и все, что угодно. банальным urlencode(), urldecode() не пробовали пользоваться?
да это внутренний сайт.. так что о безопасности не беспокоюсь...а что даст urldecode ? Ведь файл открывается уже не скртиптом...
подскажите плиз, вариант с преобразованием русского название в кирилицу, а то с PREG не дружу | |
|
|
|
|
|
|
|
для: larush
(18.04.2008 в 11:17)
| | Сканировать директорию или запрос к БД - что быстрее?
Лично у меня готовых решений нет, но то что они есть я уверен на 90%) | |
|
|
|
|
|
|
|
для: larush
(18.04.2008 в 11:17)
| | если не фильтровать спецсимволы, то может случиться, что вам и кавычки в URL засунут
и слеши и все, что угодно. банальным urlencode(), urldecode() не пробовали пользоваться? | |
|
|
|
|
|
|
|
для: Valick
(18.04.2008 в 11:10)
| | да я копирую файл в определенную директорию, закрепленную за данным номером договора (по ID) а когда пользователь проссматривает договор, то сканирую ее и выводу список файлов, которые он прикрепил к данному договору. Поэтому менять названия и не хочу, пока не рассматриваю вопрос хранения названий и линков в БД, мне кажется что мое решение "железобетонное", тока вот с сылками пока не разобрался. Если на след. неделе не разберусь, то придется рассматривать и работу с БД. Есть-ли готовые решения ? Буду признателен если кто кинет ссылку на статью на форуме. | |
|
|
|
|
|
|
|
для: larush
(18.04.2008 в 11:02)
| | А что вам мешает делать это всё через базу? В базе сохраняется полное имя файла и выданный при загрузке идентификатор под которым и храниться файл на сервере. Идея стара как мир) | |
|
|
|
|
|
|
|
для: larush
(18.04.2008 в 11:02)
| | не надо мучать пользователя! где гарантия, что он правильно переименует?
файлы можно переименовывать при загрузке. или давать им имя в виде метки времени.
или переводить русские буквы транслитом в латинские. спецсимволы тоже не мешало бы
убрать, но это может привести к появлению одинаковых имен. | |
|
|
|
|
|
|
|
для: larush
(18.04.2008 в 11:02)
| | судя по всему вас проблема с кодировками utf-8 и cp1251, а вообщето не рекомендуется юзать кирилицу в урле... | |
|
|
|
|