Мини профильНавигацияПопулярный материалПользователи онлайнАрхив материалаДрузья |
PHP и Upload (Загрузка файлов на сервер) Простейшая загрузка файлов на сервер при помощи php скрипта. <form action=upload.php method=post enctype=multipart/form-data> <input type=file name=uploadfile> <input type=submit value=Загрузить></form> Вот так примерно будет выглядеть приведенная multipart-форма (вы можете попробовать с ее помощью посмотреть результат работы multipart-форм, загрузив какой-нибудь файл небольшого размера на сервер): Multipart-формы обычно используют метод передачи POST. Как видно из предыдущего примера, данная форма имеет два поля: * Поле выбора файла для закачки <INPUT type=File> * Поле указания имени файла, которое он должен будет иметь на сервере <INPUT type=text> Обработка multipart-форм Прежде, чем приступить к написанию скрипта обработки multipart-формы, нужно отредактировать файл конфигурации php.ini, чтобы разрешить загрузку файлов на сервер. Конфигурационный файл PHP php.ini имеет три параметра, связанные с загрузкой файлов на сервер: * file_uploads=On - разрешает загрузку файлов на сервер по протоколу HTTP; * upoad_tmp_dir=/tmp - устанавливает каталог для временного хранения загруженных файлов; * upload_max_filesize=2M - устанавливает максимальный объем загружаемых файлов. Если ваш веб-сервер работает под управлением операционной системы Linux, то нужно перезапустить сервис: service httpd restart Как же PHP обрабатывает multipart-формы? Получив файл, он сохраняет его во временном каталоге upload_tmp_dir, имя файла выбирается случайным образом. Затем он создает четыре переменных суперглобального массива $_FILES. Этот массив содержит информацию о загруженном файле. Переменные, определенные для загруженных файлов, зависят от версии PHP и текущей конфигурации. Суперглобальный массив $_FILES доступен начиная с PHP 4.1.0. В случае, если конфигурационная директива register_globals установлена значением on, дополнительно будут объявлены переменные с соответствующими именами. Начиная с версии 4.2.0 значением по умолчанию для опции register_globals является off. Содержимое массива $_FILES для нашего примера приведено ниже. Обратите внимание, что здесь предполагается использование имени uploadfile для поля выбора файла, в соответствии с приведенной выше multipart-форме. Разумеется, имя поля может быть любым. * $_FILES['uploadfile']['name'] - имя файла до его отправки на сервер, например, pict.gif; * $_FILES['uploadfile']['size'] - размер принятого файла в байтах; * $_FILES['uploadfile']['type'] - MIME-тип принятого файла (если браузер смог его определить), например: image/gif, image/png, image/jpeg, text/html; * $_FILES['uploadfile']['tmp_name'] (так мы назвали поле загрузки файла) - содержит имя файла во временном каталоге, например: /tmp/phpV3b3qY; * $_FILES['uploadfile']['error'] - Код ошибки, которая может возникнуть при загрузке файла. Ключ ['error'] был добавлен в PHP 4.2.0. С соответствующими кодами ошибок вы можете ознакомиться здесь После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта. То есть алгоритм работы сценария загрузки файла на сервер такой: Если кнопка "Submit" нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES['uploadfile']['name']. В этом случае скрипт должен сразу скопировать файл с именем $_FILES['uploadfile']['tmp_name'] в какой-нибудь каталог (необходимы права на запись в этот каталог). Копирование файла производится функцией copy(): Используйте только функцию копирования copy(), а не перемещения, поскольку: * Временный файл будет удален фвтоматически; * Если временный каталог находится на другом носителе, будет выведено сообщение об ошибке. Предположим, нам нужно загрузить файл в каталог uploads, который находится в корневом каталоге веб-сервера (в каталоге DocumentRoot). // На всякий случай создадим каталог. Если он уже создан, // сообщение об ошибки мы не увидим, поскольку воспользуемся оператором @: @mkdir("upload", 0777); // Копируем файл из /tmp в uploads // Имя файла будет таким же, как и до отправки на сервер: copy($_FILES['uploadfile']['tmp_name'],"upload/".basename($_FILES['uploadfile']['name'])); В Linux все намного сложнее - нам нужно учитывать права доступа к каталогу uploads. Скорее всего в таком случае, функция mkdir() не сработает, так как у нас нет прав на запись в каталог DocumentRoot (обычно это /var/www/html или /home/httpd/html). Зарегистрируйтесь в системе как пользователь root, создайте каталог uploads и измените его владельца и права доступа следующим образом: // Создаем каталог uploads mkdir uploads // Устанавливаем имя владельца apache и его группу - тоже apache: chown apache:apache uploads // Разрешение записи всем (777) + установка закрепляющего бита (1): chmod 1777 uploads Размер файла можно ограничить, при желании можно отредактировать файл .htaccess и ограничить доступ к каталогу uploads - указать или конкретных пользователей, которым можно обращаться к каталогу, или IP-адреса. Вот теперь можно загружать файлы на сервер. Пишем PHP скрипт загрузки файлов на сервер <?php // Каталог, в который мы будем принимать файл: $uploaddir = './files/'; $uploadfile = $uploaddir.basename($_FILES['uploadfile']['name']); // Копируем файл из каталога для временного хранения файлов: if (copy($_FILES['uploadfile']['tmp_name'], $uploadfile)) { echo "<h3>Файл успешно загружен на сервер</h3>"; } else { echo "<h3>Ошибка! Не удалось загрузить файл на сервер!</h3>"; exit; } // Выводим информацию о загруженном файле: echo "<h3>Информация о загруженном на сервер файле: </h3>"; echo "<p><b>Оригинальное имя загруженного файла: ".$_FILES['uploadfile']['name']."</b></p>"; echo "<p><b>Mime-тип загруженного файла: ".$_FILES['uploadfile']['type']."</b></p>"; echo "<p><b>Размер загруженного файла в байтах: ".$_FILES['uploadfile']['size']."</b></p>"; echo "<p><b>Временное имя файла: ".$_FILES['uploadfile']['tmp_name']."</b></p>"; ?> Загрузка на сервер нескольких файлов Загрузку нескольких файлов можно реализовать используя, например, различные значения name для тега input. Также предусмотрена возможность автоматического получения организованной в массив информации о нескольких одновременно загружаемых файлах. Для реализации такой возможности используйте тот же синтаксис отправки массива из HTML-формы, что и для множественных полей select и checkbox: <form action="upload.php" method="post" enctype="multipart/form-data"> Send these files:<br> <input name="userfile[]" type="file"><br> <input name="userfile[]" type="file"><br> <input type="submit" value="Отправить файлы"> </form> В случае, если такая форма была отправлена, массивы $_FILES['userfile'], $_FILES['userfile']['name'], и $_FILES['userfile']['size'] будут инициализированы (точно так же, как и $HTTP_POST_FILES для PHP 4.1.0 и более ранних версий). Если конфигурационная директива register_globals установлена значением on, также будут инициализированы сопутствующие глобальные переменные. Каждая из таких переменных будет представлять собой численно индексированный массив соответствующих значений для принятых файлов. Предположим, что были загружены файлы /home/test/some.html и /home/test/file.bin. В таком случае переменная $_FILES['userfile']['name'][0] будет иметь значение some.html, а переменная $_FILES['userfile']['name'][1] - значение file.bin. Аналогично, переменная $_FILES['userfile']['size'][0] будет содержать размер файла some.html и так далее. Переменные $_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfile']['size'][0] и $_FILES['userfile']['type'][0] также будут инициализированы. Заключение:
php upload file Раздел: Уроки PHP Дата: 3-02-2012, 15:36 | Добавил: WorldPad | Читали: 872 | Другие новости по теме:Комментарии:Оставить комментарий |
ОпросКак давно вы программируете на PHP? Поисковая статистика
Метки уроков.htaccess, class, denwer, error, file_get_contents, function, get_cache, Google, HTML, input, mysql, MySql PHP Apache, PHP, register_globals, return, SEO, str_replace(), template, Yandex, Отправка почты, Статья, браузер, будет, доступен, кеширование на php, комментарии, массив, поисковой, постраничная навигация, продвижение, работы, сайт, сервер, ссылки, статей, статьи, текст, текстов, функции, функция
Показать все теги |