Загрузка файлов
Автор: | Артемьев Сергей Игоревич |
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. |
Размер загружаемых файлов может значительно меняться от провайдера к провайдеру. Некоторые администраторы вообще запрещают загрузку файлов. В этом случае файл всё равно может загрузиться, сервер его удалит, а скрипту сообщит, что файл был, но уже удалён.