WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Загрузка файлов на сервер


Прислал: Павел Бардин [ 22.10.2003 @ 16:52 ]
Раздел:: [ Статьи по PHP ]


Сайт автора: //proger.ru

Конкретно

Здесь будет рассмотрена загрузка файлов на сервер по протоколу HTTP. Рассмотрим два варианта конфигурации PHP:

  • register_globals=On - все параметры передаваемые скрипту,  автоматически становятся глобальными переменными.
  • register_globals=Off - параметры передаваемые скрипту заносятся в массивы $_GET, $_POST, $_FILES, $_COOKIE, ...

Upload файлов при register_globals=On

Напишем HTML форму для отправки файла на сервер.

Содержание формы (файл upload.html):
<html>
<body>
<FORM ENCTYPE="multipart/form-data" ACTION="myup.php" METHOD=POST>
Выберете файл: <INPUT NAME="myfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Загрузить">
</FORM>
</body>
</html>

После того как пользователь выбрал имя файла и нажал кнопку Загрузить, PHP помещает загружаемый файл во временную директорию указанную в параметре upload_tmp_dir файла php.ini. В этой директории этот файл будет храниться только во время запроса! После запроса PHP удалит этот временный файл. Поэтому загружаемый файл нужно куда-нибудь переместить (если он вам понадобиться в дальнейшем). Явно удалить временный файл можно функцией unlink(string filename).

Здесь рассмотрим загрузку текстового файла и вывод его содержимого.

Скрипт обработки:

<?php
// Загрузка файлов на сервер
// Если register_globals=On

    print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>");
    print("Имя файла на компьютере пользователя: ".$myfile_name."<br>");
    print("MIME-тип файла: ".$myfile_type."<br>");
    print("Размер файла: ".$myfile_size."<br><br>");

    // Получаем содержимое файла
    $fp = fopen($myfile,"r");
    $content = fread($fp, filesize($myfile));
    fclose($fp);

    // Вывод содержимого файла
    print($content);
?>

Пояснения:

$myfile - имя временного файла, в котором находятся загруженные данные;

Когда пользователь отправляет форму, PHP автоматически определяет ещё несколько переменных:

$myfile_name - имя файла на компьютере компьютере пользователя;

$myfile_type - MIME-тип файла.

$myfile_size - размер файла в байтах.

При загрузке текстовых файлов переменная $myfile_type = "text/plain", при загрузке изображения gif переменная $myfile_type = "image/gif".

При register_globals=On можно пользоваться массивом $_FILES[].

 

Upload файлов при register_globals=Off

В этом случае PHP формирует массив $_FILES[]. В этом массиве храниться вся информация о всех загружаемых файлах. В нашем случае структура этого массива следующая:

$_FILES["myfile"]["tmp_name"] - Имя временного файла
$_FILES["myfile"]["name"] - Имя файла на компьютере пользователя
$_FILES["myfile"]["size"] - Размер файла в байтах
$_FILES["myfile"]["type"] - MIME-тип файла
$_FILES["myfile"]["error"] - код ошибки.

PHP код для обработки формы:

<?php
// Загрузка файлов на сервер
// Если register_globals=Off

    // Если upload файла
    if(isset($_FILES["myfile"]))
    {
        $myfile = $_FILES["myfile"]["tmp_name"];
        $myfile_name = $_FILES["myfile"]["name"];
        $myfile_size = $_FILES["myfile"]["size"];
        $myfile_type = $_FILES["myfile"]["type"];
        $error_flag = $_FILES["myfile"]["error"];

        // Если ошибок не было
        if($error_flag == 0)
        {
            print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>");
            print("Имя файла на компьютере пользователя: ".$myfile_name."<br>");
            print("MIME-тип файла: ".$myfile_type."<br>");
            print("Размер файла: ".$myfile_size."<br><br>");

            // Получаем содержимое файла
            $fp = fopen($myfile,"r");
            $content = fread($fp, filesize($myfile));
            fclose($fp);

            // Вывод содержимого файла
            print($content);

        } // end of if 2
    } // end of if 1
?>

При загрузке можно проверять размер файла ($myfile_size) и если его размер превышает требуемый, то вывод файла не производить.

Значения $_FILES["myfile"]["error"]:

0 - ошибок не было, файл загружен.
1 - размер загруженного файла превышает размер установленный параметром upload_max_filesize в php.ini
2 - размер загруженного файла превышает размер установленный параметром MAX_FILE_SIZE в HTML форме.
3 - загружена только часть файла
4 - файл не был загружен (Пользователь в форме указал неверный путь к файлу).

Если вам необходимо сохранить загруженный файл, то это можно сделать с помощью функций:

  • copy ( string source, string dest);
  • move_uploaded_file ( string filename, string destination);

Функция copy() копирует файл source в место назначения dest.

Функция move_uploaded_file() перемещает загруженный файл filename в место назначение указанное в параметре destination.

Ещё хочется отметить что при одновременной загрузке нескольких файлов т.е. когда HTML форма содержит:

<INPUT NAME="myfile1" TYPE="file">
<INPUT NAME="myfile2" TYPE="file">
<INPUT NAME="myfile3" TYPE="file">

массив $_FILES[] будет иметь следующую структуру:

$_FILES["myfile1"]["tmp_name"] - Имя временного файла 1
$_FILES["myfile1"]["name"] - Имя файла на компьютере пользователя 1
$_FILES["myfile1"]["size"] - Размер файла 1 в байтах 
$_FILES["myfile1"]["type"] - MIME-тип файла 1
$_FILES["myfile1"]["error"] - код ошибки для файла 1.

$_FILES["myfile2"]["tmp_name"] - Имя временного файла 2
$_FILES["myfile2"]["name"] - Имя файла на компьютере пользователя 2
$_FILES["myfile2"]["size"] - Размер файла 2 в байтах 
$_FILES["myfile2"]["type"] - MIME-тип файла 2
$_FILES["myfile2"]["error"] - код ошибки для файла 2.

$_FILES["myfile3"]["tmp_name"] - Имя временного файла 3
$_FILES["myfile3"]["name"] - Имя файла на компьютере пользователя 3
$_FILES["myfile3"]["size"] - Размер файла 3 в байтах 
$_FILES["myfile3"]["type"] - MIME-тип файла 3
$_FILES["myfile3"]["error"] - код ошибки для файла 3.

это пример для одновременной загрузки трёх файлов.

Таким же образом можно загружать и двоичные файлы, например файлы картинок gif, jpeg и т.д. 

У меня все двоичные файлы загружались без повреждений (без глюков), но по словам Дмитрия Бородина (//php.spb.ru) возможно, что при загрузке двоичных файлов у вас возникнут проблемы. Файлы будут загружаться с перекодировкой.

Вот часть статьи "Как делать UPLOAD файлов на сервер и о возможных глюках" сайта //php.spb.ru, которая возможно поможет вам устранить причину проблемы:

ЦИТИРОВАНИЕ 

Попробуйте аплодить таким способом на сервер бинарные файлы. Скорее всего файлы окажутся "битыми": фотки не будут показываться, программы не запустятся, архивы не распакуются. Текстовые файлы (почти точно) не повредятся. Дело в том, что Русский Апач (ваш веб-сервер) перекодирует все подряд. Например, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20). Чтобы выключить эту ненужную перекодировку, допишите в файл http2d.conf из каталога Апача (/usr/local/apache) следующие строки. Если у вас нет доступа к этому файлу и админ сервера не может сделать это за вас, ткните его в эти строки. 

<Location />
CharsetRecodeMultipartForms Off
</Location>


Строку CharsetRecodeMultipartForms Off можно добавлять в разные места (один раз). Если вы совсем начинающий пользователь и не решите сами, куда писать эту строку, будьте аккуратнее при решении задачи методом тыка.

КОНЕЦ ЦИТИРОВАНИЯ

Если вы заметили где-то ошибку, то пожалуйста сообщите об этом на форуме или напишите мне:
bardin-pavel@yandex.ru?subject=bug.




 :::::  RomikChef пишет 22.10.2003 @ 17:03 
совершенно непонятно, зачем сделан кусок про регистер_глобал = он
как будто второй вариант не будет работать.

А вообще, глава оригинальной документации, посвященная аплоаду, имхо, гораздо информативнее.
 :::::  RomikChef пишет 22.10.2003 @ 17:16 
У тебя все двоичные файлы загружались без повреждений потому, что у тебя стоит не русский апач.
А данное замечание относится к программе под названием Russian Apache и временам, когда она стояла на значительном числе хостов.

по поводу же статьи - в сто раз было бы полезнее, если бы ты не выводил принятый файл на экран, что есть действие бессмысленное и высосанное из пальца, а делал бы реальную вещь - копировал файл в нужное место, рассмотрев при этом гораздо более распространенную ошибку отсутствия прав и непонимания, что такое "полный путь к файлу на диске".
вот тогда бы это была действительно ценная статья.
А так, всю ее можно свести к одному куску кода, который ,кстати, есть и в докеументации.

Несмотря на резкость моего тона, советую обратить внимание на суть.
 :::::  RomikChef пишет 22.10.2003 @ 17:28 
можно, я ошибку здесь напишу, а не мейлом?
"Upload файлов при register_globals=Off. В этом случае PHP формирует массив $_FILES[]. "
Данный текст можно истолковать только в одном смысле.
что при Register_globals=on такой массив сформирован не будет.
Это неправда.

То же самое и в начале. При on переданные скрипту данные становятся глобальными переменными, И ПРИ ЭТОМ заносятся в массивы $_GET, $_POST, $_FILES, $_COOKIE, ...


 :::::  yUAC пишет 26.10.2003 @ 15:02 
Создается такое ощущение, что у человека, который написал эту статью недостаточно опыта. Документацию может прочесть любой дурак, а вот правильно написать это - далеко не каждый.

Насчет register_globals - полностью поддерживаю RomikChef, они будут работать в любом случае и использовать массив $_FILES гораздо предпочтительней.

Насчет загрузки сразу нескольких файлов - это вообще отдельная песня ! Что, нельзя было сделать одно имя - "files[]", и тогда будет автомассив - сколько хочешь файлов, столько и суёшь :).
 :::::  Gromit пишет 10.11.2003 @ 20:56 
move_uploaded_file()-forever!
 :::::  drbach пишет 11.11.2003 @ 15:56 
Пока объявление этой "Киры" не удалил модератор, хочу спросить "не по теме" Мужики, мне вчера на СМС пришла аналогичная фишка, причем, похоже, что это рассылал робот, потому что реакция была не на смысл, а на ответ, как будто смысла не читают. В конце "разговора" было приглашение в СМС-чат. Есть подозрение, что это планомерная раскрутка от какой-то фирмы. Кто что думает?
Интересно мнение продвинутых технарей. Кто фишку сечет?
 :::::  drbach пишет 11.11.2003 @ 15:58 
Да, почему вспомнил, телефон был ПОХОЖИЙ!
 :::::  HAGer пишет 15.11.2003 @ 12:47 
2 RomikChef
Ок. Ну вот ты высказал свои мысли на это счет. А теперь не мог бы ты поделиться тем как надо записывать в нужный каталог и т.п. То, а чем ты тут написал.
 :::::  Mick Twain пишет 19.11.2003 @ 00:31 
>Павел Бардин
Вообще хорошая статья, и не слушайте всех, кто на вас "наезжает". Так обычно всегда бывает - всмысле есть недовольные.
 :::::  Ник пишет 22.11.2003 @ 18:27 
Вот странно, телаю все как написано - неполучается
сервер - Apache/1.3.23 (Unix) (ASP/Linux) mod_ssl/2.8.7 OpenSSL/0.9.6b PHP/4.1.2 mod_perl/1.26
проверял и с regster_globals=on и наоборот...
переменные неоределены - NULL :-((((
что делать??
 :::::  Minh пишет 23.11.2003 @ 15:41 
2 yUAC
Вот ты ламо заткнись, ненавижу таких мудаков
 :::::  Virus пишет 01.12.2003 @ 05:29 
А как сделать upload на сервер по протоколу SSH, и можно ли это вообще?
 :::::  TrIcK пишет 18.12.2003 @ 13:41 
Хочу сказать огромное СПАСИБО автору этой статьи. Правда я ещё не разбирался с кодом, но эта статья может быть первым шагом в деле создания моей курсовой.
 :::::  Andrew пишет 19.12.2003 @ 21:57 
Офигительная статья! Отличается она хоть чем нибудь в лучшую строну от мана? Тем что бездумно скопирован кусок чужо статьи? Так вот дорогой Павел Бардин у вас файлы не бьются потому что у вас не Рашиан Апач. Так для справки. Чтоб не было больше "по словам".

А где проверка на размер файла, расширение? Это почти единственно с чем возникают проблемы. Еще неплохо бы расмотреть загрузку картинок...
Правда это все есть в мане...

Вообщем статья халявщика...
 :::::  Андрей пишет 19.02.2004 @ 21:07 
Как описать пароль, и проверить правильный ли он ?
 :::::  semka пишет 15.04.2004 @ 12:06 
Стаья мне не понравилась. Я человек в пхп неискушенный. После неё пришлось читать мануал.
И признаться после этого статья ещё более показалась мне неимеющей практической ценности.
А загрузить файл можно всего лишь указав в action одну строчку
<? move_uploaded_file($myfile, "/path/to/download/dir/$myfile_name"); ?>



 :::::  Trinux пишет 09.11.2004 @ 11:30 
Мне тоже несного непонятно. зачем использовать fwrite итп, если можно воспользоваться например copy() или тем же move_uploaded_file() ???
 :::::  sekT0id пишет 28.12.2004 @ 18:04 
Апач не использую.
Пишу в phpExpertEditor.
php 4.3.6

У меня из-за этой вот фразы ENCTYPE="multipart/form-data" форма вообще ничего не передает, кроме переменных указаных в action. А как я понял без ENCTYPE="multipart/form-data" файл передаваться не будет.

Никто с такой ситуацией не сталкивался ???
 :::::  karas пишет 27.01.2005 @ 00:58 
Воще нехрена не понятно куда чё загружать обясните ламеру
 :::::  Mayc пишет 17.03.2007 @ 17:34 
sekT0id:
Без ENCTYPE="multipart/form-data никак нельзя, этими словами ты указываешь форме, что она должна передавать файлы.
 :::::  jackbv пишет 31.03.2008 @ 18:33 
статья хорошая , мне понравилась !
по мойму все супер , но я неумею загружать файлы (в этом я полный ноль) и мне очень интересно как же создать файл "php.ini" , что там писать , и все такое...

И еще, как прописать код чтобы пользователь мог загружать файлы через FTP протокол !?
подскожите ламеру в этом деле !!!
 :::::  Plagiarism пишет 17.04.2008 @ 14:39 
Статья куйня... автор ничего кроме стандартной доки так и не придумал (а в некоторых местах даже перекрутил). Пусть лучше напишет о правах доступа на не Win-машинах
 :::::  From_TLT пишет 01.03.2010 @ 03:16 
Я только в начале изучения этого языка и статья мне реально помогла! спасибо!
 :::::  Ирина пишет 27.11.2015 @ 03:33 
Спасибо, статья очень помогла.
 :::::  Ирина пишет 27.11.2015 @ 03:33 
Спасибо, статья очень помогла.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0172119