→ Пошук по сайту       Увійти / Зареєструватися
Знання Мова програмування PHP Работа с файловой системой

Загрузка файла на сервер

Компетенція Програмування на PHP

Загрузка файла на сервер

Теперь решим более сложную и часто возникающую на практике задачу загрузки файла на сервер. Первое, что нужно сделать, чтобы загрузить файл на сервер, это создать html-форму. Для того чтобы с помощью этой формы можно было загружать файлы, она должна содержать атрибут enctype в теге form со значением multipart/form-data, а также элемент input типа file.

Пример 9.11.

<form enctype="multipart/form-data" 
    action="parse.php" method="post">
  <input type="hidden" name="MAX_FILE_SIZE"
    value="30000" />
  Загрузить файл: <input type="file" 
    name="myfile" /><br>
  <input type="submit" 
    value="Отправить файл" />
</form>
Пример 9.11. Форма для загрузки файла на сервер

Заметим, что мы добавили в форме скрытое поле, которое содержит в себе максимальный допустимый размер загружаемого файла в байтах. При попытке загрузить файл, размер которого больше указанного в этом поле значения, будет зафиксирована ошибка. В браузере созданная нами форма будет выглядеть как строка для ввода текста с дополнительной кнопкой для выбора файла с локального диска (рис 9.1).

Пример формы для загрузки файла на сервер
Рис. 9.1.  Пример формы для загрузки файла на сервер

Теперь нужно написать скрипт, который будет обрабатывать полученный файл.

Вся информация о загруженном на сервер файле содержится в глобальном массиве $_FILES. Этот массив появился начиная с PHP 4.1.0. Если включена директива register_globals, то значения переданных переменных доступны просто по их именам.

Если мы загрузили с компьютера-клиента файл с именем critics.htm  размером 15136 байт, то скрипт с единственной командой print_r($_FILES); выведет на экран следующее:

Array ( [myfile] => 
  Array ( [name] => critics.htm 
    [type] => text/html 
    [tmp_name] => C:\WINDOWS\TEMP\php49F.tmp
    [error] => 0 
    [size] => 15136 
    )
) 

Вообще говоря, массив $_FILES всегда имеет следующие элементы:

  • $_FILES['myfile']['name'] – имя, которое имел файл на машине клиента.
  • $_FILES['myfile']['type'] – mime-тип отправленного файла, если браузер предоставил эту информацию. В нашем примере это text/html.
  • $_FILES['myfile']['size']размер загруженного файла в байтах.
  • $_FILES['myfile']['tmp_name'] – временное имя файла, под которым он был сохранен на сервере.
  • $_FILES['myfile']['error'] – код ошибки, появившейся при загрузке.

Здесь 'myfile' – это имя элемента формы, с помощью которого была произведена загрузка файла на сервер. То есть оно может быть другим, если элемент формы назвать иначе. Но вот другие ключи (name, type и т. д.) остаются неизменными для любой формы.

Если register_globals=On, то доступны также дополнительные переменные, такие как $myfile_name, которая эквивалентна $_FILES['myfile']['name'], и т.п.

 Ошибок при загрузке в PHP выделяют пять типов и соответственно $_FILES['myfile']['error'] может иметь пять значений:

0 – ошибки не произошло, файл загружен успешно

1 – загружаемый файл превышает размер, установленный директивой upload_max_filesize в файле настроек php.ini

2 – загружаемый файл превышает размер, установленный элементом MAX_FILE_SIZE формы html

3 – файл был загружен частично

4 – файл загружен не был

По умолчанию загруженные файлы сохраняются во временной директории сервера, если другая директория не указана с помощью опции upload_tmp_dir в файле настроек php.ini. Переместить загруженный файл в нужную директорию можно с помощью функции move_uploaded_file().

Функция move_uploaded_file() имеет следующий синтаксис:

bool move_uploaded_file (временное_имя_файла,
                         место_назначения )

Эта функция проверяет, действительно ли файл, обозначенный строкой временное_имя_файла, был загружен через механизм загрузки HTTP методом POST. Если это так, то файл перемещается в файл, заданный параметром место_назначения (этот параметр содержит как путь к новой директории для хранения, так и новое имя файла).

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

<?
/* В версиях PHP, более ранних, 
чем 4.1.0, вместо массива 
$_FILES нужно использовать 
массив $HTTP_POST_FILES */

$uploaddir = 'c:/uploads/';     
    // будем сохранять загружаемые 
    // файлы в эту директорию
$destination = $uploaddir . 
     $_FILES['myfile']['name'];
    // имя файла оставим неизменным
print "<pre>";
if (move_uploaded_file(
    $_FILES['myfile']['tmp_name'], 
    $destination)) { 
/* перемещаем файл из временной папки 
в выбранную директорию для хранения */

    print "Файл успешно загружен <br>";
} else {
  echo "Произошла ошибка при загрузке файла.
    Некоторая отладочная информация:<br>";
    print_r($_FILES);
}
print "</pre>"; 
?>
Пример 9.12. Программа загрузки файла на сервер
    © INTUIT.ru. Автор: Н.В. Савельева. Курс размещен по договоренности с администрацией INTUIT.ru
загрузка...
Теми розділу
Сторінки, близькі за змістом