Загрузка файлов
Зачастую необходимо обеспечить, чтобы пользователи могли удаленно загружать файпы на Web-узел. Например, на Web-узел вакансий необходимо загружать резюме, а в электронный фотоальбом — фотографии.
Использование форм для загрузки файловДля обеспечения загрузки файлов на Web-узел можно разработать специальную HTML-форму, которая может иметь следующий вид:
<form enctype="multipart/form-data" action="processfile.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> <input type="file" name="user_file"> <input type="submit" value="Загрузить файл"> </form>
Рассмотрим элементы формы более подробно: - Атрибут enctype дескриптора <form>. Для обеспечения корректной загрузки файла этот атрибут должен иметь значение multipart/form-data.
- Скрытое поле, в котором указан максимальный размер загружаемого файла MAX_FILE_SIZE (в байтах). Пользователь не сможет загрузить файл, размер которого превышает MAX_FILE_SIZE. Однако перед использованием значения MAX_FILE_SIZE в конфигурационный файл php.ini нужно внести следующие изменения.
- upload_max_filesize. Значение MAX_FILE_SIZE не может превышать значение upload_max_filesize. Если необходимо загрузить файлы большего размера, следует изменить значение upload_max_filesize в файле php.ini. По умолчанию оно составляет 2 Мбайт.
- post_max_size. Эта переменная определяет максимальный объем информации, который можно передать с использованием метода POST. По умолчанию значение post_max_size равно 8 Мбайт, но его можно изменить.
- Поле file, которое используется для удаленной загрузки файла.
Значение MAX_FILE_SIZE должно быть установлено перед удаленной загрузкой файла. Лишь в этом случае можно ограничить его размер.
При загрузке файла он сохраняется во временном каталоге. Поскольку после завершения выполнения сценария этот файл из временного каталога удаляется, следует скопировать его в другое место. С помощью функции phpinfо() можно определить, где расположен временный каталог. Его можно изменить с помощью директивы upload_tmp_dir файла php.ini. Если же в файле php.ini путь не указан, то используется временный каталог, установленный по умолчанию.
Получение информации о загружаемом файлеКроме самого файла, вместе со значениями полей формы передается и информация о самом файле. Эта информация сохраняется во встроенном массиве $_FILES, который можно использовать для получения данных о каждом загружаемом файле. При этом доступ к информации осуществляется посредством имен полей. Общий формат извлечения информации о файле имеет вид:
$_FILES['имя-поля']['name'] $_FILES['имя-поля']['type'] $_FILES['имя-поля']['tmp_name'] $_FILES['имя-поля'] [ 'size']
Пусть, например, файл загружается с помощью следующего поля формы: <input type="file" name="user_file"> Тогда при загрузке файла test.txt информацию о нем можно получить следующим образом:
$_FILES[user_file][name] = test.txt $_FILES[user_file][type] = text/plain $_FILES[user_file][tmp_name] = D:\WINNT\php92C.tmp $_FILES[user_file][size] = 435
В массиве _FILES значение name определяет имя загружаемого файла; type — его тип; tmp_name— путь или имя временного файла; size — размер файла. Обратите внимание, что в поле name содержится только имя файла, а в поле tmp_name — полный путь и имя.
Если же размер файла оказался слишком большим, то в поле tmp_name будет содержаться значение попе, а в поле size — 0. По умолчанию загружаемые файлы временно сохраняются в системном каталоге Windows (Windows — в системе Win98/XP и Winnt — в Win2000) и в каталоге /tmp систем Unix/Linux. Чтобы изменить временный каталог, нужно модифицировать файл php.ini. Для этого найдите в этом файле строку
;upload_tmp_dir = Затем удалите в начале строки точку запятой и задайте требуемый путь. Например: upload_tmp_dir = d:\tempfiles При этом каталог tempfiles должен быть создан предварительно. В противном случае загружаемые файлы будут сохраняться в каталоге, заданном по умолчанию.
Перемещение файлов в требуемый каталогДля перемещения загруженных файлов из временного каталога в требуемое местоположе предназначена функция move_uploaded_file() со следующим общим синтаксисом:
move_uploaded_file(путь/имя_временного_файла, путь/имя_постоянного_файла);
В элементе tmp_name массива $_FILES хранится временное имя файла и его местоположение. Так что для перемещения файла, например в каталог с:\data\new_file.txt, можно воспользоваться функцией move_uploaded_file() следующим образом:
move_uploaded_file($_FILES['user_file'] ['tmp_name'], 'с:\data\new_file.txt'); Следует заметить, что каталог, в который перемещается файл (в приведенном примере с:\data\) , должен быть предварительно создан, поскольку функция move_upload_file() этого не делает.
С точки зрения обеспечения безопасности удаленная загрузка файлов может оказаться достаточно опасным делом. Эти файлы могут содержать опасное содержимое. Поэтому перед сохранением файла необходимо тщательно проверить его формат и размер. Иногда для обеспечения большей защищенности стоит даже изменить имя и расширение загруженного файла.
Совмещая все вместеПример полноценного сценария приведен в листинге А. Этот сценарий отображает форму для загрузки файлов изображений и позволяет сохранять эти файлы. Кроме того, после проверки файла и его успешной загрузки выводится соответствующее сообщение. Форма для загрузки изображений показана на рисунке ниже.
Листинг A. Сценарий для загрузки файлов с помощью формы с методом POST ‹?php /* Имя сценария: uploadFile.php * Описание: загружает файл с помощью протокола HTTP * и формы с методом POST. */ if(!isset($_POST['Upload'])) #5 { include("form_upload.inc"); } # endif else #9 { if($_FILES['pix']['tmp_name'] == "none") #11 { echo "<b>Файл не был загружен. Проверьте его размер. Размер файла должен быть менее 500K.<br>", include("form_upload.inc"); exit(); } if(!ereg("image", $_FILES['pix']['type'])) #16 { echo "<b>Файл не является изображением. Попробуйте загрузить другой файл.</b><br>"; include("form_upload.inc"); exit(); } else #23 { $destination = 'c:\data'. "\\".$_FILES['pix']['name']; $temp_file = $_FILES['pix']['tmp_name']; move_uploaded_file($temp_file, $destination); echo "<р><b>Файл успешно загружен:</b> {$_FILES['pix']['name']} ({$_FILES['pix']['size']})</p>"; } } ?›
|
В листинге A заслуживают внимания следующие строки: - В строке 5 с использованием условного оператора if проверяется, были ли значения из формы переданы пользователем. Если нет, исходная форма отображается путем включения файла, приведенного в листинге В.
- Строка 9. В блоке else обрабатывается файл и вся полученная информация.
- В строке 11 с использованием оператора if проверяется успешность загрузки файла. Если файл не был загружен, выводится соответствующее сообщение об ошибке и исходная форма отображается повторно.
- В строке 16 проверяется корректность формата файла. Если загружаемый файл не является изображением, выводится соответствующее сообщение об ошибке и исходная форма отображается заново.
- Строка 23. В блоке else (т.е. при успешной загрузке) загруженный файл перемещается в требуемое местоположение и выводится соответствующее сообщение.
В листинге В приведен код включаемого файла, который обеспечивает отображение исходной формы для загрузки изображений:
<!-- Имя сценария: form_upload.inc Описание: отображает форму для загрузки файла --> <html> <head><title>3arpyзкa фaйлa</title></head> <body> <оl><li>Введите имя изображения, которое вы хотите поместить в архив, или воспользуйтесь кнопкой Обзор, чтобы указать его местоположение.</li> <li>После появления пути к файлу в текстовом поле щелкните на кнопке Загрузить изображение.</li> </ol> <div align="center"><hr> <form enctype="multipart/form-data" action="uploadFile.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="500000"> <input type="file" name="pix" size="60"> <p><input type="submit" name= "Upload" value="Загрузить изображение"> </form> </body></html>
|
Обратите внимание, что в этом файле содержится только HTML-код.
|