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