ТаблицейБлоками.Приложение Д: PHP upload - Загрузка файлов на сервер |
Последняя модификация: 10.08.2014 г
Страница загружена с адреса: http://webdesign.site3k.ru/conjuncture/append/d/upload.html
В некоторых ситуациях может потребоваться загрузка файлов на сервер не по FTP-протоколу, а по HTTP. Наиболее часто такая загрузка встречается на форумах, предоставляющих возможность участникам выбирать картинки для визуализации, или в баннерных сетях, где участник сети должен предоставлять свои баннеры. Может она пригодиться и в других ситуациях.
Скрипт загрузки опирается на следующую HTML-форму:
<form enctype="multipart/form-data" action="<?=$_SERVER['SCRIPT_NAME']?>" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="1000"> Отправить файл: <input name="myfile" type="file"> <input type="submit" value="Выполнить"> </form>
В этой форме обязательно применяется метод POST, так как только этим методом допускается отправка файлов и тип кодирования multipart/form-data (как в письмах с вложением), поскольку этот запрос является запросом с вложением. Так же в ней может применяться встроенная переменная MAX_FILE_SIZE1 , указывающая допустимый размер отправляемого файла в байтах. Переменная MAX_FILE_SIZE не является обязательной, но если используется, обязана указываться до указания поля файла.
Использование переменной MAX_FILE_SIZE не гарантирует того что, посетитель не сможет отправить файл большей величины. Для ее обхода злонамеренному или небрежному посетителю достаточно использовать собственную форму на своем сайте, отправляющую запрос на ваш скрипт. Для полной гарантии, скрипт должен проверять, во-первых, переменную $HTTP_REFERER (откуда пришел запрос), во-вторых, установлена ли переменная MAX_FILE_SIZE и соответствует ли она заданному значению, в-третьих, не превышает ли размер загруженного файла значение переменной MAX_FILE_SIZE. Проверка трех этих условий дает полную гарантию того что, ситуация развивается строго по ВАШЕМУ сценарию.
Полученный из формы файл помещается в каталог для временных файлов (сведенья о котором можно получить по переменной upload_tmp_dir) и по окончании работы скрипта автоматически уничтожается. Пока скрипт работает, и файл не уничтожен, его содержимое можно вывести на страницу, функцией
readfile(Имя_временного_файла_на_сервере);
или скопировать (переместить) в целевой каталог функциями (если целевой файл уже существует, он молча заменяется новым)
copy(Имя_временного_файла_на_сервере, "результирующее_имя");
или
move_uploaded_file(Имя_временного_файла_на_сервере, "результирующее_имя");
Если содержимое файла помещается в массив или переменную величина файла не должна превышать значение переменной memory_limit, устанавливающей максимальное количество оперативной памяти доступной скрипту (если таковая установлена).
Для копирования или перемещения файла в заданный каталог, на этом каталоге должны стоять атрибуты 777, которые можно установить с помощью ftp-клиента или PHP-функции chmod("имя_каталога", 0777).
Знание реального имени временного файла не требуется для выполнения этих действий. После получения данных скриптом сведенья о файле доступны через специальные переменные и массивы ключом к которым является атрибут name элемента input type="file" отправившей его формы. Так, если имя этого элемента «myfile», ключом к данным о файле будет «myfile» и все сведенья о нем можно получить по трем схемам:
Переменная | Содержание |
---|---|
$myfile_name | Имя файла на компьютере |
$myfile_type | MIME-тип файла (если его сообщил браузер) |
$myfile | Имя временного файла на сервере |
$myfile_size | Размер файла |
Переменная | Содержание |
---|---|
$HTTP_POST_FILES['myfile']['name'] | Имя файла на компьютере |
$HTTP_POST_FILES['myfile']['type'] | MIME-тип файла (если его сообщил браузер) |
$HTTP_POST_FILES['myfile']['tmp_name'] | Имя временного файла на сервере |
$HTTP_POST_FILES['myfile']['size'] | Размер файла |
$HTTP_POST_FILES['myfile']['error'] | Код ошибки, возникшей при загрузке файла |
Переменная | Содержание |
---|---|
$_FILES['myfile']['name'] | Имя файла на компьютере |
$_FILES['myfile']['type'] | MIME-тип файла (если его сообщил браузер) |
$_FILES['myfile']['tmp_name'] | Имя временного файла на сервере |
$_FILES['myfile']['size'] | Размер файла |
$_FILES['myfile']['error'] | Код ошибки, возникшей при загрузке файла |
Генерируемый PHP код ошибки имеет следующие значения:
is_uploaded_file(Имя_временного_файла_на_сервере)
Проверяющую, был ли файл загружен.
Для загрузки нескольких файлов следует помещать в форму несколько элементов типа file, имеющих разные имена или несколько полей, в имени которых используется массив:
<input name="myfile[]" type="file">
В данном случае имена файлов будут доступны по дополнительному ключу массива:
Для первого файла
Для второго файла
$_FILES['myfile']['name'][0]
$_FILES['myfile']['type'][0]
$_FILES['myfile']['tmp_name'][0]
$_FILES['myfile']['size'][0]
$_FILES['myfile']['error'][0]
$_FILES['myfile']['name'][1]
$_FILES['myfile']['type'][1]
$_FILES['myfile']['tmp_name'][1]
$_FILES['myfile']['size'][1]
$_FILES['myfile']['error'][1]
И так далее.
Таковы теоретические основы загрузки файлов на сервер по HTTP-протоколу с использованием PHP и форм с элементом type="file". А так выглядит практический скрипт для выполнения этой задачи:
1 Кроме переменной MAX_FILE_SIZE максимальный размер загружаемого файла ограничивает директива upload_max_filesize в php.ini, значение которой можно узнать применив функцию phpinfo(). Сервер не позволит загрузить файл большей величины, чем указана в upload_max_filesize даже если MAX_FILE_SIZE не установлена или позволяет загрузку таких файлов. По умолчанию upload_max_filesize равно двум мегабайтам. Кроме того, ограничение на размер загружаемого файла оказывает переменная post_max_size, устанавливающая максимальный размер данных в POST-запросе. Если размер файла не выходит за рамки, установленные в MAX_FILE_SIZE и upload_max_filesize, но общий размер данных формы после кодирования больше определенного в post_max_size, файл не будет загружен.