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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: неправильное имя при загрузке файла на сервер
 
 автор: Oleg-Perm   (30.04.2006 в 15:16)   письмо автору
 
 

Задача: необходимо закачивать файлы с русскими именами на сервер хостинга, так, чтобы они имели после закачки русское имя (а не кракозяблики :)

Что получается: после тестирования на локальном сервере (Apach+WinXP) файлы закачиваются нормально, имена остаются прежние. Проверено на Firefox и IExplorer.

Тестирование на хостинге: файлы закачиваются, имена становятся абра-кадаброй, причем это только под IExplorer, а при использовании Firefox имена остаются нормальные.

Такое впечатление, что происходит перекодировка или ещё что то, и это видимо из-за того, что на хостинге скорее всего установлена Linux/Unix подобная ОС. Можно ли как то это исправить? Может быть нужно где то указать кодировку имен файлов?

Вот нужные части кода:
выдержка из index.php

<?
//Вывести форму для загрузки файлов
  
print"<table width=600  border=0 cellspacing=1 cellpadding=5 align=center bgcolor=#000000><form enctype='multipart/form-data' action=upload.php method=POST>
   <tr bgcolor=#BBBBBB height=30><td width=100% background=images/bckg.gif><font class=font_2><b>Загрузка файлов в "
.$path_name."/</b></td></tr>
        <tr bgcolor=#EEEEEE><td ><div align=center><font class=font_1><b>Размер файла не должен превышать "
.$max_upload."</B></font></div></td>
</tr><tr bgcolor=#FFFFFF>
<td><div align=center><font class=font_1><b>Общий размер файлов не должен превышать "
.$max_post."</B></font>
<input type=hidden name=MAX_FILE_SIZE value="
.$upload_size.">
<input type=hidden name=d_path value="
.$d_path.">
<input type=hidden name=uin value="
.$uin."> <br>";
print 
"<table width=100%>\n";
for(
$i=1$i<=$files_to_upload/2$i++) {
        
$n $i;
        print 
"<tr>\n";
        print 
"<td><font class=font_1>Файл: </font><input name=userfile".$n." type=file class=input_text></td>\n";
        print 
"<td><font class=font_1>Файл: </font><input name=userfile".($n+($files_to_upload/2))." type=file class=input_text></td>\n";
        print 
"</tr>\n";
}
print 
"</table>";
print 
"<hr size=2 noshade><input type=image name=upload src=images/upload.gif border=0 alt='Загрузить файлы'></div></td></tr></form></table>";
?>


файл upload.php

<?
//Файл: upload.php
//Назначение: Обрабатывает файлы, полученные по протоколу HTTP, выводит информацию

//Включить файл config.php
include("config.php");

session_name("CF");
session_start();


$x="";
$count 0;
for(
$i=1$i<=$files_to_upload$i++) {
        
$filename "userfile".$i;
        
$filename_size "userfile".$i."_size";
        
$filename_name "userfile".$i."_name";
        
$upload $path."/".$$filename_name;
        if($
$filename != "" and $$filename != "none") {
                if(
copy($$filename$upload)) {
                        
$x .= "<br>Файл: ".$$filename_name." загружен.";
                }
        }
        else { 
$count++; }
}

if (
$count == $files_to_upload) {
        
header ("Location: ./?d_path=".$d_path."&write=".base64_encode("Ошибка! Не выбраны файлы для загрузки.")."&uin=".$uin);
        exit;
}
else {
        
$x substr_replace($x""04);
        
header ("Location: ./?d_path=".$d_path."&write=".base64_encode($x)."&uin=".$uin);
        exit;
}
?>

   
 
 автор: Oleg-Perm   (30.04.2006 в 18:46)   письмо автору
 
   для: Oleg-Perm   (30.04.2006 в 15:16)
 

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

   
 
 автор: Trianon   (30.04.2006 в 22:04)   письмо автору
 
   для: Oleg-Perm   (30.04.2006 в 18:46)
 

Вы бы показали, что именно поступает на вход PHP-скрипту при запуске из FF и из IE.
Например, через print_r($_FILES) в начале обработчика формы. На боевом сервере, естественно. Вслепую сложно что-то советовать...

   
 
 автор: Oleg-Perm   (30.04.2006 в 22:37)   письмо автору
 
   для: Trianon   (30.04.2006 в 22:04)
 

Дело в том, что я не совсем так хорошо разбираюсь в PHP как вы, Trianon. Объясните по конктретнее (если можно), что и где написать для того чтобы это отловить :)

   
 
 автор: Trianon   (01.05.2006 в 10:42)   письмо автору
 
   для: Oleg-Perm   (30.04.2006 в 22:37)
 

Написать надо в начале обработчика формы ( т.е. в начале файла upload.php, например после session_start(); ) следующую строку:

 echo '<pre>'; print_r($_FILES); 

   
 
 автор: Oleg-Perm   (01.05.2006 в 17:59)   письмо автору
 
   для: Trianon   (01.05.2006 в 10:42)
 

Строку добавил, вот результат (закачиваю один файл с именем Закачка.txt):

Через Firefox
Array
(
[userfile1] => Array
(
[name] => Закачка.txt
[type] => text/plain
[tmp_name] => /tmp/phpvgMnqi
[error] => 0
[size] => 234
)

[userfile3] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)

[userfile2] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)

[userfile4] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)

)

Через ИЕ

Array
(
[userfile1] => Array
(
[name] => &#9578; Є зЄ .txt
[type] => text/plain
[tmp_name] => /tmp/php2a4dbk
[error] => 0
[size] => 234
)

[userfile3] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)

[userfile2] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)

[userfile4] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)

)

Похоже ИЕ неправильно отправляет имя файла (если я правильно понимаю смысл распечатки массива $_FILES).
Что делать дальше?
P.S. На самом деле имя немного другое было (оно изменилось, после добавления в форум). Его вид на картинке.

   
 
 автор: Trianon   (01.05.2006 в 23:17)   письмо автору
 
   для: Oleg-Perm   (01.05.2006 в 17:59)
 

Пожалуй, если Вы хотите стабильной работы скрипта, можно лишь посоветовать добавить для каждого загружаемого файла по текстовому полю. Куда пользователь введет имя. Так как до заголовков файлов из PHP Вы не доберетесь. Как вариант, можно конечно поменять язык, и решить эту частную задачу через CGI-скрипт на perl... Но тут я Вам помочь не смогу.

   
 
 автор: oleg-perm   (01.05.2006 в 23:56)   письмо автору
 
   для: Trianon   (01.05.2006 в 23:17)
 

Большое Вам спасибо, Trianon, но необходимо решить эту задачу именно так как описано в скрипте. Без дополнительных форм, и прочего. Предполагается, что этим будут пользоваться люди и как мне объяснить, что если вы загружаете файл \\\"работа.doc\\\", то его название вы должны повторить во второй форме! Мне же сразу скажут, что ежу понятно, что это и есть \\\"работа.doc\\\" ! Какая то глупая получается операция, почти как на проверку трезвости :)

ПРЕДЛАГАЮ КИНУТЬ КЛИЧ, ДЛЯ ВСЕХ УВАЖАЮЩИХ СЕБЯ ЛЮДЕЙ, КОТОРЫЕ СЧИТАЮТ, И ИМЕННО СЧИТАЮ СЕБЯ ПРОГРАММИСТАМИ НА \\\"PHP\\\". РАДИ УВАЖЕНИЯ К САМИМ СЕБЕ, НЕ ДАЙТЕ ПОГИБНУТЬ НАЧИНАЮЩЕМУ, Т.К. ВДРУГ У НЕГО РАДЯТСЯ ХОРОШИЕ ИДЕИ.

Чтото CapsLock нажался, случайно :)
С П А С И Б О, Ч Т О Н Е О С Т А Л И СЬ В С Т О Р О Н Е ! ! !

   
 
 автор: cheops   (02.05.2006 в 11:43)   письмо автору
 
   для: oleg-perm   (01.05.2006 в 23:56)
 

Проблема в том, что реализация протокола HTTP не поддерживает файлы с национальными символами (может только Windows-реализация, но Интернет построен на UNIX-машинах).

   
 
 автор: Oleg-Perm   (02.05.2006 в 17:54)   письмо автору
 
   для: cheops   (02.05.2006 в 11:43)
 

Почему же тогда из Firefox загрузка проходит нормально? (Смена кодировки проявляется только при использовании ИЕ).
Возможно ли \"вытащить\" имя файла из формы при отправке (может с помощью Java) и закинуть его в какую нибудь переменную, в которой он сохранится, а затем на сервере, после загрузки переименовать его?
Т.е. пусть есть файл документ.doc отправляем его как file01.doc а на сервере переименуем обратно в документ.doc.

   
 
 автор: Oleg-Perm   (02.05.2006 в 22:50)   письмо автору
 
   для: Oleg-Perm   (02.05.2006 в 17:54)
 

P.S. Попробовал перебросить сайт на другой хостинг (бесплатный agava.ru) проблема решилась! Теперь из ИЕ можно загрузить русский файл. Появляется другой вопрос: в чем различие хостинга? Настройки, или разные ОСи? Может что нибудь намылить админу первого хостинга? :)

   
 
 автор: Trianon   (02.05.2006 в 23:39)   письмо автору
 
   для: Oleg-Perm   (02.05.2006 в 22:50)
 

Для начала сравните вывод phpinfo(); на этих хостингах.

   
 
 автор: Oleg-Perm   (07.05.2006 в 20:22)   письмо автору
27 Кб
 
   для: Trianon   (02.05.2006 в 23:39)
 

Там, где русские файлы не работают в графе System: Linux hosting3, а там где работают System: FreeBSD in-entropy16.agava.net 4.11-RELEASE-patched-p2 FreeBSD 4.11-RELEASE-patched-p2 i386
наверное все дело в этом.

В приложенном файле две страницы phpinfo с двух серверов. Какая строка может быть причиной?

   
 
 автор: Oleg-Perm   (16.05.2006 в 15:40)   письмо автору
 
   для: Oleg-Perm   (07.05.2006 в 20:22)
 

Никто так и не ответит?

   
 
 автор: Hive   (21.05.2006 в 03:40)
 
   для: Oleg-Perm   (16.05.2006 в 15:40)
 

Похожая проблема. но наоборот..
В ИЕ все нормально, а в Опере фигня разная..

   
 
 автор: Пётр   (21.05.2006 в 12:23)   письмо автору
 
   для: Hive   (21.05.2006 в 03:40)
 

Если данные из текстовых полей формы передаются нормально, то просто подставить в отдно из таких hidden полей перед отправкой имя файла

<form name="sendfile" action="actionfile.php" method="post" onSubmit="FileNameReserv()">
<input name="userfile" type="file" value="">
<input type="hidden" name="reservname" value="">
<script language="JavaScript">
function FileNameReserv()
    {
    document.sendfile.reservname.value=document.sendfile.userfile.value;
    }
</script>



или имя файла надо кодировать на стороне клиента в спецсимволы типа &255; (по образу &nbsp; - пробел) для этого надо JS писать замены кирилических (да и любых других букв в эти самые спецсимволы)
вот как это выглядит на PHP (но на стороне клиента нужен JS) этот код для примера работы с такими символами


<?
// Сначала создаем массив того, что мы собираемся выводить,
// не заботясь о форматировании (дизайне) информации
for($i=0,$x=0$x<16$x++) {
for(
$y=0$y<16$y++) {
$Chars[$x][$y]=array($i,chr($i));
$i++;
}
}
// Теперь выводим накопленную информацию, используя идеологию
// вставки участков кода в HTML-документ
?>
<table border=1 cellpadding=1 cellspacing=0>
<?for($y=0$y<16$y++) {?>
<tr>
<?for($x=0$x<16$x++) { ?>
<td>
<?=$Chars[$x][$y][0]?>:
<b><tt><?=$Chars[$x][$y][1]?></tt></b>
</td>
<?}?>
</tr>
<?}?>
</table>

   
Rambler's Top100
вверх

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