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

Форум PHP

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

 

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

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

тема: Почему может не работать $_FILES при upload файлов???
 
 автор: andry   (14.07.2004 в 16:29)   письмо автору
 
 

Разбираюсь с upload файлов (на одном компьютере и сервер и рабочая станция) и столкнулась вот с какой проблемой: не могу воспользоваться массивом $_FILES, точнее данными, которые в нем содержатся касательно загружаемого файла. Ошибок ни PHP, ни сервер не выдают, php.ini и httpd.conf настроены согласно. Все вроде бы нормально, должно работать, ан нет. Может как-то по-другому указывается возможность использования массива $_FILES?
Помогите, плз!!!

   
 
 автор: Кузнецов М.В.   (14.07.2004 в 16:41)   письмо автору
 
   для: andry   (14.07.2004 в 16:29)
 

> не могу воспользоваться массивом $_FILES, точнее данными,
>которые в нем содержатся касательно загружаемого файла.
Если не сложно, приведите здесь строчку, в которой вы берете данные из $_FILES.

   
 
 автор: andry   (15.07.2004 в 08:48)   письмо автору
 
   для: Кузнецов М.В.   (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($fdfilesize($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>

   
 
 автор: cheops   (15.07.2004 в 10:22)   письмо автору
 
   для: 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:24)   письмо автору
 
   для: cheops   (15.07.2004 в 10:22)
 

И тип файла, за одно:
<?php
echo "Тип файла - ".$_FILES['foto']['type'];
?>

   
 
 автор: andry   (15.07.2004 в 13:22)   письмо автору
 
   для: 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>";?>

Этот код выдает только сожержание ковычек (например, Путь к файлу на сервере следующий: ), а дальше пустота.....

   
 
 автор: cheops   (15.07.2004 в 13:53)   письмо автору
 
   для: andry   (15.07.2004 в 13:22)
 

Понятно, значит сервер отфутболивает где-то файл и PHP тут скорее всего не причём - в логах Apacha что-нибудь интересное есть? FireWall никакой не применяется?

   
 
 автор: cheops   (15.07.2004 в 14:26)   письмо автору
 
   для: cheops   (15.07.2004 в 13:53)
 

Хотя вот ещё что может быть, посмотрите в php.ini значение директивы
 variables_order = "EGPCS" 

Ну и на всякий случай post_max_size и upload_max_filesize, хотя в этих директивах всё нормально, иначе вообще ничего не работало бы...

   
 
 автор: andry   (15.07.2004 в 15:39)   письмо автору
 
   для: cheops   (15.07.2004 в 14:26)
 

В php.ini:
variables_order = "GPCS"
post_max_size = 8M
upload_max_filesize = 2M
Ни FireWall, ничто подобное не стоит.

   
 
 автор: cheops   (14.07.2004 в 22:32)   письмо автору
 
   для: 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

   
 
 автор: andry   (15.07.2004 в 08:15)   письмо автору
 
   для: 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 )?

   
 
 автор: Кузнецов М.В.   (15.07.2004 в 10:35)   письмо автору
 
   для: andry   (15.07.2004 в 08:15)
 

Да, директива track_vars всегда включена, начиная с версии PHP 4.0.3.

   
 
 автор: andry   (15.07.2004 в 08:44)   письмо автору
 
   для: cheops   (14.07.2004 в 22:32)
 

Спасибо, я посмотрела соседнюю ветку. Все это у меня в on, и Local, и Master.
Мне еще непонятно с правами: себе как пользоваетлю я дала на директорию upload_tmp_dir = "C:\AppServ\www\temp\" права 777 (закладка Доступ), да еще и на закладке Безопасность я сделала как себе (пользоваетлю), так и своей машине тоже полный доступ (по аналогии с IIS, там, по-моему, дается право машине на запись и т.д. в ту папку (wwwroot/base), где лежит БД). Это все верно, или я наворочила что-то с правами, а может и совсем не поняла, для каких директорийони даются???? И какое отношение это имеет к моей проблеме???

   
 
 автор: cheops   (15.07.2004 в 10:36)   письмо автору
 
   для: andry   (15.07.2004 в 08:44)
 

Хм... правильно ли я понял: это рабочий сервер Apache, работающий под управлением Windows или это всё-таки IIS?

   
 
 автор: andry   (15.07.2004 в 13:14)   письмо автору
 
   для: cheops   (15.07.2004 в 10:36)
 

Нет, сейчас речь идет о сервере Apache, работающим под управлением Windows. Так правильно я указала права или нет??? И что значит установить право записи во временную папку для сервера Apache, который вообще никаких прав на сервере не имеет...

   
 
 автор: cheops   (15.07.2004 в 13:59)   письмо автору
 
   для: andry   (15.07.2004 в 13:14)
 

Меня смущает 777... Windows разве поддерживает систему безопасности UNIX, в любом случае лучше установить 644, или ещё ниже, так как исполняться во временных папках нечему и не зачем...
Под Windows мы имеем дело только с локальными серверами и как следствие проблемам безопасной работы Apache внимания не уделяли...
PS А версия сервера Apache какая и на каком он порту висит?
PPS Apache в UNIX обычно выполняется с минимальными правами, чтобы в случае переполнения буффера, получив, права apache злоумышленник не смог ничего поделать. Но что бы apache работал у него должно быть право чтения и записи в его рабочих и верменных директориях.

   
 
 автор: andry   (15.07.2004 в 15:43)   письмо автору
 
   для: cheops   (15.07.2004 в 13:59)
 

Сервер Apache Web Server Version 1.3.29, порт 80.

   
 
 автор: cheops   (15.07.2004 в 17:02)   письмо автору
 
   для: 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).

   
 
 автор: andry   (19.07.2004 в 08:47)   письмо автору
 
   для: cheops   (15.07.2004 в 17:02)
 

Спасибо, я нашла Apache 2.0.44, попробую его поставить.
Наши ребята мне дали архивчик (выдернутый, естественно, где-то в инете), где все было: и PHP, и MySQL, и Apache, и все это под WINDу. И еще, я только начинаю осваивать web-программирование, и мне непонятна фраза PHP установлен как модуль или как внешний CGI-скрипт , как это можно узнать???

   
 
 автор: glsv (Дизайнер)   (19.07.2004 в 09:18)   письмо автору
 
   для: 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 

   
 
 автор: Кузнецов М.В.   (14.07.2004 в 23:39)   письмо автору
 
   для: 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(
"Ошибка загрузки файла");
}
?>

   
Rambler's Top100
вверх

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