HTML, Excel, Word, SEOPHP курс для чайников ⇒ Загрузка файлов

PHP для "чайников"

Инструменты
Выбираем IDE
Выбираем Web-сервер
Выбираем СУБД
Структура языка PHP
Первый шаг
Синтаксис
Типы данных
Переменные и константы
Операторы
Выражения
Управляющие структуры
Функции
Классы
Исключения
Ошибки
Массивы
Глобальные массивы
Cookies
Сессии
Загрузка файлов
Работа с файлами
Работа с файлами на диске
Работа с данными в файле
Пример управления файлами
Работа с базами данных
Подключение
Анализ результатов
Выполнение запросов
Отключение
Пример: отслеживание пользователей
Работа в сети
Отправка почты
Безопасность
HTTP-аутентификация
Защита логином и паролем
Автоматизация
Регулярные выражения в PHP
Интеграция
PHP и JavaScript

 

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


Автор: Артемьев Сергей Игоревич
ICQ: 438856621
email: _spin_@bk.ru

Практически в каждом проекте разработчик сталкивается с необходимостью загрузки файлов на сервер. Фотографии, картинки, документы, архивы и многое другое может быть загружено на сервер посредством web-интерфейса (через браузер).


Загрузка данных на сервер может происходить одним из двух методов: GET или POST. Метод GET подразумевает, что все параметры передаются в строке URL. Например, строка:

    http://localhost/index.php?name=myname&page=10

определяет запрос GET к странице index.php. При этом скрипту передаются параметры "name" и "page" со значениями "myname" и "10" соответственно. Как видите, запрос состоит из пар "имя=значение", объединённых через "&". Запрос отделяется от адреса страницы знаком вопроса "?".

Но GET не подходит для передачи больших данных. Для этого существует метод POST. Этот метод передаёт данные скрыто от пользователя, а адрес страницы остаётся неизменным. Теоретически, метод POST позволяет передавать огромные блоки данных, но большинство провайдеров устанавливают жесткое ограничение в 5-10 мегабайт.

Для реализации загрузки файла необходимо снабдить пользователя соответствующей формой. Для загрузки файлов предназначен тег input типа file.

    <form action="receiver.php" method="post"
        enctype="multipart/form-data">

        Выберите файл для загрузки: 

        <input type="file" name="ufile" /><br />

        <input type="submit" name="send" value="Отправить!" />
    </form>

Пользователь выбирает нужный файл, нажимает кнопку "Отправить!", после чего браузер передаёт указанный файл на сервер. По окончании загрузки файла запускается receiver.php, и ему автоматически становятся доступны все переданные в форме данные.

Список загруженных файлов хранится в глобальном массиве $_FILES. Это ассоциативный массив, где каждый элемент содержит описание одного из файлов. Рассмотрим на примере:

<?php
  // инициализируем нужные переменные
  $filename = '';
  $filepath = '';
  $filetype = '';

  // проверяем, что файл загружался
  if(isset($_FILES['ufile']) &&
      $_FILES['ufile']['error'] != 4)
  {
    // проверяем, что файл загрузился без ошибок
	if($_FILES['ufile']['error'] != 1 &&
        $_FILES['ufile']['error'] != 0)
	{
	  $error = $_FILES['ufile']['error'];
	  $errors []= 'Ошибка: Файл не загружен.'.
                    ' Код ошибки: ' . $error;
	}
	else
    {
      // файл загружен на сервер

      // проверяем файл на максимальный размер
	  $filesize = $_FILES['ufile']['size'];
	  if($_FILES['ufile']['error'] == 1 ||
            $filesize > 3145728)
	  {
	   	$filesize = ($filesize != 0)?
            sprintf('(%.2f Мб)' , $filesize / 1024): '';
	   	die('Ошибка: Размер прикреплённого файла '.
            $filesize.' больше допустимого (3 Мб).');
	  }
	  else
	  {
	    $filename = $_FILES['file']['name'];
	   	$filepath = $_FILES['file']['tmp_name'];
	   	$filetype = $_FILES['file']['type'];
	   	if($this->filetype == null ||
            $this->filetype == '')
	   	  $this->filetype = 'unknown/unknown';
	  }
	}
  }

  echo 'Успешно загружен файл: ' . $filename;

?>

Все загруженные файлы сохраняются сервером во временном каталоге и автоматически удаляются после завершения скрипта. Если вам необходимо сохранить файл на сервере - его надо переместить в один из каталогов сайта. Для этого служит специальная функция move_uploaded_file(). Обчно она используется в паре с функцией is_uploaded_file(), которая позволяет определить, был ли файл загружен через форму. Например:

<?php
    // $filename - имя загруженого файла
    if(is_uploaded_file($filename))
        move_uploaded_file($filename,
            'files/' . basename($filename));
    // файл будет перемещён в каталог files/
?>

Информация о каждом загруженном файле представляется в скрипте как элемены массива $_FILES. Имя элемента определяется атрибутом name тега формы. В нашем случае атрибут name равен "ufile", значит данные об этом файле будут храниться в элементе $_FILES['ufile'].

Каждый элемент $_FILES так же является массивом, содержащим пять элементов с фиксированными именами:

$_FILES['ufile']['name'] Содержит исходное имя файла, каким оно было на компьютере пользователя.
$_FILES['ufile']['type'] Содержит MIME-тип файла. Например, для jpeg-изображения будет содержать "image/jpeg".
$_FILES['ufile']['size'] Содержит истинный размер переданного файла в байтах.
$_FILES['ufile']['tmp_name'] Содержит полный путь с загруженному на сервер файлу. Если вам не нужно хранить загруженный файл на сервере - можно пользоваться этим параметром для обращения к файлу.
$_FILES['ufile']['error'] Содержит код ошибки, если таковая имела место. Если ошибок нет - содержит 0.

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



В начало страницы



В начало страницы