Опубликован: 01.03.2005 | Доступ: свободный | Студентов: 33897 / 4520 | Оценка: 4.31 / 4.06 | Длительность: 16:41:00
ISBN: 978-5-9556-0026-0
Лекция 9:

Работа с файловой системой

Удаление файла

Последнее, что мы хотим изучить из действий над файлами, - это удаление файлов. Для того чтобы удалить файл с помощью языка PHP, нужно воспользоваться функцией unlink(). Синтаксис этой функции можно описать следующим образом:

bool unlink ( имя_файла)

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

<?php
$filename = 'c:/users/files/my_file.html';
unlink($filename);  
  // удаляем файл с именем 
  // c:/users/files/my_file.html
?>
Пример 9.10. Использование функции unlink()

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

Теперь решим более сложную и часто возникающую на практике задачу загрузки файла на сервер. Первое, что нужно сделать, чтобы загрузить файл на сервер, это создать 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. Программа загрузки файла на сервер

Заключение

Подведем итоги. В этой лекции мы изучили, как создавать файлы с помощью языка PHP, как записывать данные в файлы посредством PHP, как считывать из них информацию различными способами, как проверять существование и доступность файла для записи и чтения. Кроме того, мы рассмотрели задачу загрузки файла на сервер и обсудили основные связанные с ней переменные и функции языка PHP.

Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Артём Терентьев
Артём Терентьев
Россия, г. Орск
Нигина Иргашева
Нигина Иргашева
Таджикистан