|
|
|
| Разбираюсь с upload файлов (на одном компьютере и сервер и рабочая станция) и столкнулась вот с какой проблемой: не могу воспользоваться массивом $_FILES, точнее данными, которые в нем содержатся касательно загружаемого файла. Ошибок ни PHP, ни сервер не выдают, php.ini и httpd.conf настроены согласно. Все вроде бы нормально, должно работать, ан нет. Может как-то по-другому указывается возможность использования массива $_FILES?
Помогите, плз!!! | |
|
|
|
|
|
|
|
для: andry
(14.07.2004 в 16:29)
| | > не могу воспользоваться массивом $_FILES, точнее данными,
>которые в нем содержатся касательно загружаемого файла.
Если не сложно, приведите здесь строчку, в которой вы берете данные из $_FILES. | |
|
|
|
|
|
|
|
для: Кузнецов М.В.
(14.07.2004 в 16:41)
| | Да, конечно можно, но она классическая, как в мануале написано:
файл test.php
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
Фото:<input type="file" name "userfile">
<input type="submit" name="add" value="Добавить">
</form>
|
файл upload.php
<?php
$uploaddir = 'temp/';
if (move_uploaded_file($_FILES['userfile']['tmp_name'],$uploaddir.$_FILES['userfile']['name']))
{
print "Файл помещен во временную директорию";
}
else
{
print "К сожалению, ничего не вышло";
}
?>
|
В итоге, я получаю сообщение, что "К сожалению, ничего не вышло"
А сначала я пробовала запихнуть файл в БД, и это тоже не работало (точнее все записывалось в таблицу, кроме картинки):
файл message.php
<?session_start()?>
<?require_once('mysql.inc')?>
<?require_once('auth.inc')?>
<?require_once('stat.inc')?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Content-Language" content="ru">
<title>Сообщения</title>
</head>
<body>
<?
if(@$_POST['add'])
{
$avtor=$_POST['avtor'];
$tel=$_POST['tel'];
$body=strip_tags ($_POST['body']);
// проверяем, был ли загружен файл через HTTP
if((is_uploaded_file($_FILES['foto']['tmp_name']))and($_FILES['foto']['type']=="image/pjpeg"))
{
$filename = $_FILES['foto']['tmp_name'];
$fd = fopen($filename, "rb");
$foto = addslashes(fread($fd, filesize($filename)));
fclose ($fd);
}
else
{
$foto=null;
}
mysql_query("INSERT INTO g_book(t_date,avtor,phone,body_mas,pictur) values(now(),'$avtor','$tel','$body','$foto')");
header("Location: message.php"); /* Redirect browser */
exit;
}
?>
<?
$result=mysql_query("SELECT * FROM g_book");
if(@mysql_num_rows($result)!=0)
{
for(@$i==0;@$i<mysql_num_rows($result);@$i++)
{
$data=mysql_fetch_array($result);
$mdata=$data['t_date'];
$mavtor=$data['avtor'];
$mtel=$data['phone'];
$mbody=$data['body_mas'];
$id=$data['id'];
$foto=$data['pictur'];
?>
<p></p>
<form enctype="multipart/form-data" action="" method="post">
<table border="0" width="550">
<tr>
<td width="20%" bgcolor="#EEEEEE"><?=$mdata?></td>
<td width="50%" bgcolor="#EEEEEE"><?=$mavtor?></td>
<td width="30%" bgcolor="#EEEEEE"><?=$mtel?></td>
</tr>
<tr>
<td colspan="3">
<table border="0" width="100%">
<tr>
<td bgcolor="#C0C0C0"><?=$mbody?></td>
<td width="158" bgcolor="#C0C0C0">
<?if($foto!=""){?>
<img width="200" src="foto.php?id=<?=$id?>">
<?}?>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p></p>
<?
}
}
else
{
echo "Сообщений пока нет";
}
?>
<table border="0" width="500" >
<tr>
<td width="13%" p align="right">Автор:</td>
<td width="87%" p align="left"><input type="text" name="avtor"></td>
</tr>
<tr>
<td width="13%" p align="right">Телефон:</td>
<td width="87%" p align="left"><input type="text" name="tel"></td>
</tr>
<tr>
<td width="13%" p align="right">Текст:</td>
<td width="87%" p align="left"><textarea name="body" cols="57" rows="5"></textarea></td>
</tr>
<tr>
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
<td width="13%" p align="right">Фото:</td>
<td width="87%" p align="left"><input type="file" name "foto"></td>
</tr>
<tr>
<td colspan="2" p align="center"><input type="submit" name="add" value="Добавить"></td>
</tr>
</table>
</form>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: andry
(15.07.2004 в 08:48)
| | А просто вывод оператором echo что даёт:
<?php
echo "Имя временного файла - ".$_FILES['userfile']['tmp_name'];
?>
|
PS is_uploaded_file должен бы, конечно, работать, он как раз в PHP 4.0.3 появился... | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 10:22)
| | И тип файла, за одно:
<?php
echo "Тип файла - ".$_FILES['foto']['type'];
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 10:24)
| |
<?echo "Путь к файлу на сервере следующий: ".$_FILE['foto']['tmp_name']."<br>";
echo "Путь к файлу на клиентской машине следующий: ".$_FILE['foto']['name']."<br>";
echo "Размер файла в байтах следующий: ".$_FILE['foto']['size']."<br>";
echo "Тип файла следующий: ".$_FILE['foto']['size']."<br>";?>
|
Этот код выдает только сожержание ковычек (например, Путь к файлу на сервере следующий: ), а дальше пустота..... | |
|
|
|
|
|
|
|
для: andry
(15.07.2004 в 13:22)
| | Понятно, значит сервер отфутболивает где-то файл и PHP тут скорее всего не причём - в логах Apacha что-нибудь интересное есть? FireWall никакой не применяется? | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 13:53)
| | Хотя вот ещё что может быть, посмотрите в php.ini значение директивы
variables_order = "EGPCS"
|
Ну и на всякий случай post_max_size и upload_max_filesize, хотя в этих директивах всё нормально, иначе вообще ничего не работало бы... | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 14:26)
| | В php.ini:
variables_order = "GPCS"
post_max_size = 8M
upload_max_filesize = 2M
Ни FireWall, ничто подобное не стоит. | |
|
|
|
|
|
|
|
для: andry
(14.07.2004 в 16:29)
| | За одно соседнюю ветку посмотрите... Включена ли директива file_uploads в php.ini?
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=78&id_post=460 | |
|
|
|
|
|
|
|
для: cheops
(14.07.2004 в 22:32)
| | Директива file_uploads включена, register_globals = Off
upload_tmp_dir = "C:\AppServ\www\temp\", ну и все такое тоже настроено. Только я не смогла найти, где в php.ini указывается track_vars, или она всегда on (у меня php 4.0.3 )? | |
|
|
|
|
|
|
|
для: andry
(15.07.2004 в 08:15)
| | Да, директива track_vars всегда включена, начиная с версии PHP 4.0.3. | |
|
|
|
|
|
|
|
для: cheops
(14.07.2004 в 22:32)
| | Спасибо, я посмотрела соседнюю ветку. Все это у меня в on, и Local, и Master.
Мне еще непонятно с правами: себе как пользоваетлю я дала на директорию upload_tmp_dir = "C:\AppServ\www\temp\" права 777 (закладка Доступ), да еще и на закладке Безопасность я сделала как себе (пользоваетлю), так и своей машине тоже полный доступ (по аналогии с IIS, там, по-моему, дается право машине на запись и т.д. в ту папку (wwwroot/base), где лежит БД). Это все верно, или я наворочила что-то с правами, а может и совсем не поняла, для каких директорийони даются???? И какое отношение это имеет к моей проблеме??? | |
|
|
|
|
|
|
|
для: andry
(15.07.2004 в 08:44)
| | Хм... правильно ли я понял: это рабочий сервер Apache, работающий под управлением Windows или это всё-таки IIS? | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 10:36)
| | Нет, сейчас речь идет о сервере Apache, работающим под управлением Windows. Так правильно я указала права или нет??? И что значит установить право записи во временную папку для сервера Apache, который вообще никаких прав на сервере не имеет... | |
|
|
|
|
|
|
|
для: andry
(15.07.2004 в 13:14)
| | Меня смущает 777... Windows разве поддерживает систему безопасности UNIX, в любом случае лучше установить 644, или ещё ниже, так как исполняться во временных папках нечему и не зачем...
Под Windows мы имеем дело только с локальными серверами и как следствие проблемам безопасной работы Apache внимания не уделяли...
PS А версия сервера Apache какая и на каком он порту висит?
PPS Apache в UNIX обычно выполняется с минимальными правами, чтобы в случае переполнения буффера, получив, права apache злоумышленник не смог ничего поделать. Но что бы apache работал у него должно быть право чтения и записи в его рабочих и верменных директориях. | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 13:59)
| | Сервер Apache Web Server Version 1.3.29, порт 80.
| |
|
|
|
|
|
|
|
для: andry
(15.07.2004 в 15:43)
| | Хм... Всё чисто... Сходная ситуация была у нашего Дизайнера - тоже не работал upload под Windows на Apache 1.3.x, он тогда все конфигурационные файлы перерыл - помогла только установка более новой версии Apache и PHP. Нет возможности поставить их более новые версии? Тем более как показывает практика Apache 2.0 менее капризен…
PS Кстати, PHP установлен как модуль или как внешний CGI-скрипт? Если он установлен как внешний CGI-скрипт вы можете прислать нам конфигурационные файлы Apache (http.conf) и PHP (php.ini) и мы попробуем смоделировать ситуацию (Только вряд ли я уже смогу достать PHP 4.0.3 и Apache 1.3.29 :().
PPS Кстати, в логах Apache (logs/*.log) ничего интересного нет, когда происходит обработка запроса POST? Но у меня уже подозрение, что там тоже код возврата 200 (успешная обработка). Я один раз такое видел у себя в Университете: Apache под Windows прекрасно работал в качестве локального сервера и совершенно не был виден из сети, при всё при том, в логах рапортовал, что все внешние запросы обработаны (код 200). | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 17:02)
| | Спасибо, я нашла Apache 2.0.44, попробую его поставить.
Наши ребята мне дали архивчик (выдернутый, естественно, где-то в инете), где все было: и PHP, и MySQL, и Apache, и все это под WINDу. И еще, я только начинаю осваивать web-программирование, и мне непонятна фраза PHP установлен как модуль или как внешний CGI-скрипт , как это можно узнать??? | |
|
|
|
|
|
|
|
для: andry
(19.07.2004 в 08:47)
| | PHP на Apache можно установить 2 способами - как модуль и как внешнюю программу (как CGI-скрипт)
PHP как модуль - это по сути библиотека Apache.
Как CGI - это когда php-скрипты выполняются как внешнее приложение.
Основное отличие - когда PHP установлен как CGI, то каждый раз для выполнения скрипта запускается новый процесс со своими правами.
Если же PHP установлен как модуль, то он всегда висит в памяти и работает с права назначенными самому серверу.
Установливать PHP как модуль нужно если необходимо работать с заголовками (headers) и функциями авторизации. А также если вы хотите управлять некоторыми настройками PHP из файлов .htaccess. В противном случае для этого нужно всегда лезть в PHP.INI.
Определить как установлен - просто.
Посморите httpd.conf. Вот этот блок кода устанавливает PHP, как CGI
AddType application/x-httpd-php phtml php
<Directory "c:/php">
Options ExecCGI
</Directory>
ScriptAlias "/__php_dir__/" "c:/php/"
Action application/x-httpd-php "/__php_dir__/php.exe"
|
А вот - как модуль.
AddType application/x-httpd-php phtml php php3
LoadModule php5_module modules/php5apache2.dll
|
| |
|
|
|
|
|
|
|
для: andry
(14.07.2004 в 16:29)
| | Ну и еще немного про $_FILES.
Переменная со значениями массива $_FILES может иметь один из 4 типов:
$_FILES["filename"]["name"] (содержит исходное имя файла на клиентской машине);
$_FILES["filename"]["size"] (содержит размер загруженного файла в байтах);
$_FILES["filename"]["type"] (содержит MIME-тип файла);
$_FILES["filename"]["tmp_file"] (содержит имя временного файла, в который сохраняется загруженный файл).
К примеру:
<?php
if(copy($_FILES["filename"]["tmp_name"],
"c:/temp/".$_FILES["filename"]["name"]))
{
echo("Файл успешно загружен");
echo("Характеристики файла: <br>");
echo("Имя файла: ");
echo($_FILES["filename"]["name"]);
echo("<br>Размер файла: ");
echo($_FILES["filename"]["size"]);
echo("<br>Каталог для загрузки: ");
echo($_FILES["filename"]["tmp_name"]);
echo("<br>Тип файла: ");
echo($_FILES["filename"]["type"]);
}
else
{
echo("Ошибка загрузки файла");
}
?>
|
| |
|
|
|