За последние 24 часа нас посетили 56909 программистов и 1794 робота. Сейчас ищут 919 программистов ...

Необходимые условия для работы php с файлами

Тема в разделе "Прочие вопросы по PHP", создана пользователем Trank, 5 июл 2007.

  1. Trank

    Trank Активный пользователь

    С нами с:
    5 июл 2007
    Сообщения:
    24
    Симпатии:
    0
    Здравствуйте.

    Для выполнения задачи мне необходимо открыть переданный на сервер файл. Мне это сделать не удается. В попытках упростить задачу до минимума и тем самым отсеять возможные ошибки, не имеющие отношения к первостепенной задаче, я дошел до примера из мануала PHP. Вот его код:

    index.html
    HTML:
    1.  
    2. <form enctype="multipart/form-data" action="http://localhost/upload.php" method="POST">
    3.     <!-- MAX_FILE_SIZE must precede the file input field -->
    4.     <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    5.     <!-- Name of input element determines name in $_FILES array -->
    6.     Send this file: <input name="userfile" type="file" />
    7.     <input type="submit" value="Send File" />
    8. </form>
    9.  
    upload.php
    PHP:
    1.  
    2. <?php
    3. $uploaddir = '/uploads/';
    4. $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    5.  
    6. echo '<pre>';
    7. if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    8.     echo "File is valid, and was successfully uploaded.\n";
    9. } else {
    10.     echo "Possible file upload attack!\n";
    11. }
    12.  
    13. echo 'Here is some more debugging info:';
    14. print_r($_FILES);
    15.  
    16. print "</pre>";
    17. ?>
    18.  
    В результате я имею:

    Код (Text):
    1.  
    2. Possible file upload attack!
    3. Here is some more debugging info:Array
    4. (
    5.     [userfile] => Array
    6.         (
    7.             [name] => podr.jpg
    8.             [type] => image/pjpeg
    9.             [tmp_name] => C:\DOCUME~1\Mmm\LOCALS~1\Temp\php\upload\php9C.tmp
    10.             [error] => 0
    11.             [size] => 6490
    12.         )
    13.  
    14. )

    То есть функция move_uploaded_file() не отработала корректно.
    Ну и в самом деле, файла в директории /uploads я не вижу.
    Но я также не вижу и файла C:\DOCUME~1\Mmm\LOCALS~1\Temp\php\upload\php9C.tmp

    У меня есть подозрение, что это связано с настройками php.

    До этого я пробовал открыть по-другому:
    PHP:
    1. <?php
    2. .
    3. .
    4. $f=fopen($_FILES['file']['tmp_name'],"rb") or die("Не могу открыть файл");
    5. $pic=fread($f,filesize($f))  or die("Не могу прочитать файл");
    6. .
    7. .
    8. ?>
    и в результате я получал:
    Код (Text):
    1.  
    2. Не могу прочитать файл
    Вот еще лог апача:
    line 9 в приведенном листинге является 6 строкой.


    Подскажите, в чем проблема?
     
  2. Trank

    Trank Активный пользователь

    С нами с:
    5 июл 2007
    Сообщения:
    24
    Симпатии:
    0
    исправил
    PHP:
    1.  
    2.  $uploaddir = '/uploads/';
    3.  
    на

    PHP:
    1.  
    2. $uploaddir = 'C:\\Program Files\\Apache Group\\Apache2\\htdocs\\uploads\\';
    3.  
    И файл перенесся.
    Что-то я недопонимаю...
    Почему пример из мануала для работы требует исправлений?

    Почему временный файл не появляется на диске во временной директории?
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Trank
    Код (Text):
    1. $uploaddir = '/uploads/';
    адрес со слеша начинается а значит будет считаться что он от корня того диска на котором установлен сервер
    то бишь глядя на второй код можно сказать что в твоем случае
    /uploads/ == C:/uploads/
    заметь не обязательно городить экранированные обратные слеши ;) PHP '/' понимает так же как '\\'
     
  4. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    хорошим тоном считается использование стандартной константы DIRECTORY_SEPARATOR вместо / и \\

    Trank
    PHP:
    1. <?
    2. echo getcwd();
    3. echo '<br />';
    4. echo dirname(__FILE__);
    посмотрите результаты
     
  5. C

    C Активный пользователь

    С нами с:
    28 май 2006
    Сообщения:
    326
    Симпатии:
    0
    PHP:
    1. $uploaddir = '/uploads/';
    исправь на
    PHP:
    1. $uploaddir = './uploads/';
    выводи $uploadfile и смотри что это за путь получился.
     
  6. Trank

    Trank Активный пользователь

    С нами с:
    5 июл 2007
    Сообщения:
    24
    Симпатии:
    0
    Всем спасибо за пояснения.