Эта тема на forum.dklab.ru


Viktor: файл после заливки на сервер не открывается
Проблема в том что после заливки файла на сервер, файл не открывается, но буквально неделю назад все работало.
Из html-формы пользователи отправляют файл, рнр-скрипт переносит файл из временной в рабочею директорию
Вот код скрипта:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Добавление</title>
</head>

<body>
<? include "config.php";

if ($_REQUEST['save'])
{

if ($_FILES['filename']['name']!="") {

// Загрузка файла-аттача на форуме
///////////////////////////////////////////////////


// Проверяем, не является ли файл скриптом PHP или Perl, html, если это так преобразуем его в формат .txt
$extentions = array("#\.php#i",
"#\.phtml#i",
"#\.php3#i",
"#\.html#i",
"#\.htm#i",
"#\.hta#i",
"#\.pl#i",
"#\.xml#i",
"#\.inc#i",
"#\.shtml#i",
"#\.xht#i",
"#\.xhtml#i");
// Извлекаем из имени файла расширение
$ext = strrchr($_FILES['filename']['name'], ".");
// Проверяем размер файла
if ($_FILES["filename"]["size"] > 1024*5*1024)
{
echo "Размер файла превышает 5 мегабайта";
exit;
}
// Формируем путь к файлу
$path="../../docs/img/".date("YmdHis",time()).$ext;
foreach($extentions AS $exten)
{
if(preg_match($exten, $ext)) $path="../../docs/img/".date("YmdHis",time()).".".$ext;
}
// Перемещаем файл из временной директории сервера в
// директорию /files Web-приложения
if (copy($_FILES['filename']['tmp_name'], $path))
{
// Уничтожаем файл во временной директории
unlink($_FILES['filename']['tmp_name']);
// Изменяем права доступа к файлу
chmod($path, 0644);
}
echo $_FILES["filename"]["name"]."<br>".$_FILES["filename"]["size"]."<br>".$path;
}
else { echo "Файла нет";
exit;}


// else { echo "<p><font color=red>Вы не выбрали файл </font></p>";
// echo "<a href=index.php>Вернуться</a>";
// exit(); }

//////////////////////////////////


$comment =trim ($_POST['comment']);
if (!$comment) {
echo "<p><font color=red>Вы не добавели комментарий к данному файлу</font><br>";
echo "<a href=index.php>Вернуться</a>";
exit(); }
$data =date("d.m.Y");

//$comment=htmlspecialchars(stripslashes($comment);
// Подготавливаем переменные для добавления в SQL-запрос, экранируя
// все спецсимволы при помощи функции mysql_escape_string();
//$comment = n12br($comment);
$comment = str_replace("[u]","<u>",$comment);
$comment = str_replace("[U]","<u>",$comment);
$comment = str_replace("[i]","<i>",$comment);
$comment = str_replace("[I]","<i>",$comment);
$comment = str_replace("[b]","<b>",$comment);
$comment = str_replace("[B]","<b>",$comment);
$comment = str_replace("[/u]","</u>",$comment);
$comment = str_replace("[/U]","</u>",$comment);
$comment = str_replace("[/i]","</i>",$comment);
$comment = str_replace("[/I]","</i>",$comment);
$comment = str_replace("[/b]","</b>",$comment);
$comment = str_replace("[/B]","</b>",$comment);

$comment = str_replace("'","`",$comment);
echo $comment;
if (!get_magic_quotes_gpc())
{
$text = mysql_escape_string($text);
$comment = mysql_escape_string($comment);
}
//echo $_FILES["filename"]["name"]."<br>".$_FILES["filename"]["size"]."<br>".$_FILES["filename"]["tmp_name"];
$sql=mysql_query ("INSERT INTO new SET path='$path', data='$data', comment='$comment'") or die(mysql_error());
if (!$sql)
{ echo puterror("Ошибока при добавлении");}

echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD></HTML>";

}
?>
</body>
</html>
при открытии файла выходит предупреждения, что файл поврежден.
Не пойму из-за чего появилось эта проблема, на машине где все это стоит не чего не менялось, софт не какой не ставил.
На машине стоит связка Apache 1.3.22 + php 5.0.4 + mysql 4.1.7;
За ответы заранее спасибо.
dimagolov:
Viktor, скрипт у Вас загружает файл на сервер, а битый файл при сохранении с сервера на клиента. Надо для начала разобраться он бьется при загрузка или при сохранении на клиента. Причем не открывая его вордом, а бинарно сравнивая.
какой размер файла и какие ограничения на размер а php?
Viktor:
dimagolov
В php.ini значение upload_max_filesize=5M
Я тестировал с файлом размер, которого 180kb и вот что интересно файл с расширением txt открывается нормально, а doc не открывается размер файла до закачки и после одинаковый, но он не открывается даже когда я пытаюсь открыть файл с сервера, то есть сажусь за сервер и перехожу в ту папку, куда был сохранен файл.
dimagolov:
Viktor, бинарно сравнивать версию на сервере с оригиналом пробовали?
Юрий Насретдинов:
Может, виноват «Русский Apache»?

Попробуйте добавить в .htaccess строчку

<IfModule mod_charset.c>
CharsetRecodeMultipartForms off
</IfModule>

Viktor:
dimagolov Сравневал, одинаковые.
Юрий Насретдинов Спасибо, это помогло, но мне как навичку очень интересно что значит эта строка:CharsetRecodeMultipartForms off
dimagolov:
dimagolov Сравневал, одинаковые.
так не бывает :)
Юрий Насретдинов Спасибо, это помогло, но мне как навичку очень интересно что значит эта строка:CharsetRecodeMultipartForms off
Вот после этого бывает. А какие собственные мысли есть?
п.с. выбрасывайте этот русский апач - уже не актуально, только проблемы отдни
Viktor:
dimagolov Ну размеры файла одиноковые.

Вот после этого бывает. А какие собственные мысли есть?
п.с. выбрасывайте этот русский апач - уже не актуально, только проблемы отдни

Я так понимаю для запрета перекодировки формы или что то в этом роде. :)
dimagolov:
Viktor, размер файла и бинарное сравнение это, как говорят в Одессе, две большие разницы.
А про CharsetRecodeMultipartForms Вы правы...
Viktor:
Не чего не понимаю с эти Апачем, кидаю ссылку на файлы *.pps или *.rar они не открываются, ошибка такая Архив поврежден или имеет не известный формат, хотя через проводник файлы открываются, но вордовские и txt-файлы открываются. Мне почему-то кажется это из-за настройки Апача. Помогите плизз...
Maus:
Viktor
Вы, похоже, не желаете читать, что Вам пишут:
бинарно сравнивать версию на сервере с оригиналом пробовали?
dimagolov:
кстати, можно не бинарно сравнивать, а считать MD5 или CRC32 файла для выявления различий.
kernel32:
На одном сайте, расположенном на бесплатном хостинге hut.ru, у меня возникла подобная проблема: getimagesize() возвращала false для картинки, которая загружалась через форму... но только в ИЕ! В Опере всё работало нормально!
Долго ломал голову, что же это может быть... И вспомнил про эту тему.
Юрий Насретдинов, большое СПАСИБО!
Viktor:
Maus а как это зделать?
кстати, можно не бинарно сравнивать, а считать MD5 или CRC32 файла для выявления различий
а про это я вообще первый раз слышу, можно по-подробнее.
Maus:
а как это зделать?
дожили..
Имеем:
1) исходный файл - обозначим как "эталон"
2) FTP-доступ на ресурс
3) скрипт аплоада (закачки на хост)
4) скрипт даунлоада (выкачки с хоста. В простейшем случае файлы могут отдаваться прямиком Апачем)

Сначала заливаем эталон на хост. Потом выкачиваем его же оттуда через FTP в бинарном режиме. Сравниваем с эталоном - подобная возможность есть в Total Commander, например. В WinXP есть точно и встроенная утилита - fc.exe . Если различий нет, то проблема - не в скрипте аплоада.
Теперь скачиваем тот же файл через браузер. Опять сравниваем с оригиналом. Если файл отдаётся напрямую Апачем и есть различия - возможно, это русский апач и Вам подкузьмил mod_charset
Viktor:
дожили..
Ну дилетант я еще...
Я наверно не правильно объяснил, я файл не через FTP, а по сети приписал в директорию home/www/docs.
поэтому 2 и 3 пункт опускаем.
4) скрипт даунлоада (выкачки с хоста. В простейшем случае файлы могут отдаваться прямиком Апачем)
Явно скрипта нет, поэтому этим Апач занимается, я так думаю.
Maus:
я так думаю
так это не ваш проект, что ли? Так или иначе, в данном случае желательно узнать точно.
Viktor:
Maus
Проект мой, скрипта точно нет, обычная ссылка: <a href="1111.rar">...</a>,по этому я думаю что это Апач.
Maus:
Viktor
ну осталось только сделать бинарное сравнение и убедиться, что файлы различаются. Если это так, то mod_charset
Viktor:
Maus
Я конечно извиняюсь за назойливость, но очень хочется разобраться с проблемой.
Я сравнил httpd.conf Апача из Денвера и Апача, который сам ставил, в Денвере я не нашел <IfModule mod_charset.c>, сразу уточню, что в Денвере нет проблем с загрузкой файлов с сайта, в то время как в httpd.conf Апача, который сам ставил, вот что:
<IfModule mod_charset.c>

CharsetDecl windows-1251 ru
CharsetDecl ISO-8859-5 ru
CharsetDecl ibm866 ru
CharsetDecl koi8-r ru



CharsetRecodeTable koi8-r ISO-8859-5 conf/tables/cyrillic/koi-iso.tab conf/tables/cyrillic/iso-koi.tab
CharsetRecodeTable koi8-r ibm866 conf/tables/cyrillic/koi-dos.tab conf/tables/cyrillic/dos-koi.tab
CharsetRecodeTable koi8-r windows-1251 conf/tables/cyrillic/koi-win.tab conf/tables/cyrillic/win-koi.tab

# Recoding rules for windows-1251 source encoding
CharsetRecodeTable windows-1251 ISO-8859-5 conf/tables/cyrillic/win-iso.tab conf/tables/cyrillic/iso-win.tab
CharsetRecodeTable windows-1251 ibm866 conf/tables/cyrillic/win-dos.tab conf/tables/cyrillic/dos-win.tab


# Aliases of charsets
# Format: CharsetAlias real_name alias1 alias2 alias3 ...
CharsetAlias ISO-8859-5 iso_8859-5:1988 iso-ir-144 iso_8859-5 cyrillic
CharsetAlias ISO-8859-5 iso8859-5 iso-8859.5 iso8859.5 iso
CharsetAlias ibm866 csibm866 866 cp866 x-cp866 x-ibm866 cp-866 alt
CharsetAlias windows-1251 win x-cp1251 cp1251 cp-1251
CharsetAlias koi8-r koi-8-r koi8 koi-8 koi

# Priority of charsets
CharsetPriority koi8-r windows-1251 ISO-8859-5 ibm866

# default charset for real or virtual server (selected if all other charset-
# selectons methods fails)
CharsetDefault koi8-r

#Default source (on-disk) charset
CharsetSourceEnc windows-1251

# Order in which charset selection rules applied
#CharsetSelectionOrder Portnumber Hostname UriHostname EnvVariable Dirprefix Useragent

# Associate file (on-disk) charset with extension
# CharsetByExtension windows-1251 .htm

# Strip <META HTTP-EQUIV ...> from this extension (NOTE! this is mutually
# exclusive with SSI and other non-default file processing)
AddHandler strip-meta-http .htm .html


#Select substrings for different clients identification and charsets for
# each charset
# No CharsetAgent directives - no User-Agent charset selection on server
CharsetAgent windows-1251 AIR_Mosaic IWENG/1 MSIE WinMosaic (Windows (WinNT;
CharsetAgent windows-1251 (Win16; (Win95; (Win98; (16-bit) Opera/3.0
CharsetAgent koi8-r Arena Ariadna OmniWeb Sextant PRD (X11 X11) Lynx/
CharsetAgent ibm866 DosLynx Lynx2/OS/2

# Agents that can't understand MIME
CharsetBadAgent arena Lynx/2.0 Lynx/2.1 Lynx/2.2 Lynx/2.3 Lynx/2.4 "MSIE 2.0;" Lynx2/OS/2


# Uncomment this if server must reject queries with illegal charset
#CharsetErrReject on

# Add charset= to Content-Type in all replies - default
#CharsetUseMultiViews off

# Uncomment, if you want to recode response headers (turned off by
# default for compatibility with older versions)
# CharsetRecodeHeaders on

# Comment out, if you want to recode filenames. Not recommended
CharsetRecodeFilenames Off



</IfModule>
может именно здесь нужно ковырять?
за ссылку спасибо, попробую там поискать.
Maus:
в Денвере я не нашел <IfModule mod_charset.c>
правильно. Потому что в Денвере нет mod_charset.
А он Вам вообще нужен, этот модуль? Если нет ,я бы вообще закомментировал соответствующий LoadModule (если он есть) - но это моё личное мнение.
Viktor:
Maus
Огромное спасибо Вам за терпение, понимаю, что тяжело общаться с чайником. Я закомментировал этот модуль и все прекрасно работает.
И еще вопросик: где найти мануал по настройке Апача, желательно на русском языке или подскажите название и авторов книги.
Maus:
Viktor
Увы, мне известен только один ресурс - официальная документация (но она вроде бы вся по-английски). Поищите в Сети
bæv:
Viktor, у денверовского апача в конфигурационном файле есть довольно подробные комментарии на русском.

А так, мне в сети встречались переводы официальной документации апача на русский — ищите.
Viktor:
Все равно всем спасибо за помощь, и как говорится в моем любимом фильме "Буду искать"!

Эта тема на forum.dklab.ru