Учебное пособие 1077
.pdfРежим SEEK_CUR приводит к установке указателя файла на позицию, которая смещена от текущей позиции на заданное значение. Если в данный момент указатель файла находится на позиции 18, то следующий вызов функции переместит его на позицию 23:
fseek($fh, 5, SEEK_CUR);
Загрузка файлов на веб-сервер
Загрузка файлов на веб-сервер на деле представляет не особо сложный процесс. Для загрузки файла из формы нужно лишь выбрать специальный тип кодировки который называется multipart/form-data, а все остальное будет сделано веббраузером пользователя.
Рассмотрим следующий пример:
<?php
echo <<<_END <html>
<head>
<title>PHP-форма для загрузки файлов на сервер</title>
</head>
<body>
<form method='post' action='index.php' enctype='multipart/form-data'>
Выберите файл: <input type='file' name='filename'>
<input type='submit' value='Загрузить'> </form>
</body> _END;
if ($_FILES)
{
$name= $_FILES['filename']['name'];
9
move_uploaded_file($_FILES['filename']['tmp_name'], $name);
echo "Загружаемое изображение
'$name'<br> <img src='$name'";
}
echo "</body></html>";
?>
Проанализируем программу по блокам. В первой строке многострочной инструкции echo задается начало HTMLдокумента, отображается заголовок, а затем начинается тело документа.
Далее идет форма, для передачи содержимого которой выбран метод POST, задается предназначение всех отправляемых данных программе index.php (т.е. самому исходному файлу) и указывается веб-браузеру на то, что отправляемые данные должны быть закодированы с использованием типа содержи-
мого multipart/form-data.
Для подготовки формы в следующих строках задается отображение приглашения «Выберите файл», а затем дважды запрашивается пользовательский ввод. Сначала от пользователя требуется указать файл через поле ввода input со значением атрибута type = “file”.
Затем от пользователя требуется ввести команду на отправку данных формы, для чего служить кнопка с надписью «Загрузить». После этого форма закрывается.
PHP-код, предназначенный для приема загружаемых данных, сравнительно прост, поскольку все загружаемые на сервер файлы помещаются в ассоциативный системный массив $_FILES. Поэтому для установки факта отправки пользователем файла достаточно проверить, есть ли у массива $_FILES хоть какое-нибудь содержимое. Эта проверка осуществляется с помощью инструкции if ($_FILES).
10
При первом посещении страницы пользователем, которое происходит еще до загрузки файла, массив $_FILES пуст, поэтому программа пропускает этот блок кода. Когда пользователь загружает файл, программа запускается еще раз и обнаруживает присутствие элемента в массиве $_FILES.
Когда программа обнаружит, что файл был загружен, его имя, каким оно было прочитано из компьютера, занимавшегося загрузкой, извлекается и помещается в переменную $name. Теперь нужно только переместить файл из временного места, где PHP хранит загруженные файлы, в постоянное место хранения. Это делается с помощью функции move_uploaded_file(), которой передается исходное имя файла, сохраняемого в текущем каталоге.
В конце программы загруженное на сервер изображение отображается путем помещения его имени в тег <img>.
Использование массива $_FILES
При загрузке файла на сервер в массиве $_FILES сохраняются пять элементов, показанных в табл. 2.
|
Таблица 2 |
Содержимое массива $_FILES |
|
Элемент массива |
Содержимое |
$_FILES[‘file’][‘name’] |
Имя загруженного файла |
$_FILES[‘file’][‘type’] |
MIME-тип содержимого |
|
файла |
|
|
$_FILES[‘file’][‘size’] |
Размер файла в байтах |
|
|
$_FILES[‘file’][‘tmp_name’] |
Имя временного файла, |
|
сохраненного на сервере |
$_FILES[‘file’][‘error’] |
Код ошибки, получаемый |
|
после загрузки файла |
Типы содержимого обычно называют MIME-типами
(Multipurpose Internet Mail Extension – многоцелевые почтовые расширения в Интернете), но поскольку позже они были распространены на все виды передаваемой через Интернет ин-
11
формации, то их часто называют типами информации, используемой в Интернете (Internet media types). Можно привести ряд известных MIME-типов:
application/pdf
application/zip
audio/mpeg
image/gif
image/jpeg multipart/form-data text/css
text/html
text/javascript
video/mp4
Проверка допустимости
При загрузке данных через форму важно проверять был ли файл получен, и если он получен, то был ли отправлен правильный тип данных.
Модифицируем предыдущий пример:
<?php
echo <<<_END <html>
<head>
<title>PHP-форма для загрузки файлов на сервер</title>
</head>
<body>
<form method='post' action='index.php' enctype='multipart/form-data'>
Выберите файл с расширением JPG, GIF, PNG или TIF:
<input type='file' name='filename'> <input type='submit' value='Загрузить'>
</form>
</body>
12
_END;
if ($_FILES)
{
$name= $_FILES['filename']['name']; switch($_FILES['filename']['type'])
{
case "image/jpeg": |
$ext = 'jpg'; |
|
break; |
case "image/gif": |
$ext = 'gif'; |
|
break; |
case "image/png": |
$ext = 'png'; |
|
break; |
case "image/tiff": |
$ext = 'tif'; |
|
break; |
default: |
$ext = ''; |
} |
|
if ($ext) |
|
{ |
|
$n = "image.$ext"; move_uploaded_file($_FILES['filename']['tmp_name'],
$n);
echo "Загружаемое изображение '$name'
под именем '$n'<br>"; echo "<img src='$n'>";
}
}
else echo "Загрузки изображения не произошло"; echo "</body></html>";
?>
В данном примере добавлен блок switch/case в котором проверяется соответствие типа файла четырем типам изображений. При обнаружении соответствия переменной $ext присваивается трехсимвольное расширение имени файла, относя-
13
щееся к этому типу. Если соответствие не обнаруживается, то переменной $ext будет присвоена пустая строка.
В следующем блоке проверяется, содержит ли переменная $ext строку, и в случае положительного ответа в переменной $n создается новое имя файла, составленное из основы image и расширения, сохраненного в переменной $ext. Это означает, что программа полностью контролирует имя создаваемого файла и этим именем может быть только одно из следу-
ющих: image.jpg, image.gif, image.png или image.gif.
Остальной код PHP по сути повторяет код предыдущего примера. Он перемещает загруженное временное изображение на его новое место, а затем выводит его на экран, а вместе с ним отображает старое и новое имена изображения.
Если загружен неподдерживаемый тип изображения, программа выводит сообщение об ошибке.
Работа с формами
Обработка форм является многоступенчатым процессом. Сначала создается форма, в которую пользователь может вводить необходимые данные. Затем эти данные отправляются веб-серверу, где происходит их разбор, зачастую совмещаемый с проверкой на отсутствие ошибок. Если код PHP найдет одно или несколько полей, требующих повторного ввода, форма может быть заново отображена вместе с сообщением об ошибке.
Для создания формы потребуются как минимум следующие элементы:
–открывающий и закрывающий теги – соответственно
<form> и </form>;
–тип передачи данных, задаваемый одним из методов –
GET или POST;
–одно или несколько полей для ввода данных;
–URL-адрес назначения, по которому будут отправлены данные формы.
Извлечение отправленных данных из формы
14
Рассмотрим пример программы, которая выводит на экран имя, введенное пользователем:
<?php
if (isset($_POST['name'])) $name = $_POST['name']; else $name = "(Не введено)";
echo <<<_END <html>
<head>
<title>Form Test</title> </head>
<body>
Вас зовут: $name<br>
<form method="post" action="index.php">
Как Вас зовут?
<input type="text" name="name"> <input type="submit">
</form>
</body>
</html> _END;
?>
Особое внимание следует обратить на начало программы, где в операторе if проверяется, содержит ли ассоциативный массив $_POST отправленное поле name.
Ассоциативный массив $_POST содержит все данные переданные из формы программе с помощью метода POST. В качестве индексов массива выступают имена переменных, в качестве значений элементов с данным индексом – значения переменных. Для передачи данных методом GET используется аналогичный массив $_GET.
Функция isset() проверяет, установлена ли переменная ка- ким-либо значением отличным от NULL. Если пользователь не
15
указал свое имя в текстовом поле и просто нажал кнопку «Отправить запрос», то программа присвоит переменной $name значение «(Не введено)». А если значение было отправлено, то оно сохраняется в этой переменной. После тега <body> была введена еще одна строка, предназначенная для отображения значения, сохраненного в переменной $name.
Использование одного и того же имени переменной для передачи нескольких значений
В некоторых случаях, пользователю требуется передать группу значений объединенных по какому-либо принципу: список опций, наличие определенных степеней образования. Для этого часто используются независимые переключатели или поля-флажки (checkbox).
Например, требуется указать сведения об образовании:
Среднее |
<input type="checkbox" |
name="ed" value="Среднее"> |
|
Среднее специальное |
<input type="checkbox" |
name="ed" value="Среднее специальное"> |
|
Высшее |
<input type="checkbox" |
name="ed" value="Высшее">
В данном случае в качестве имени указывается одиночная переменная, а не массив. В таком варианте программе будет отправлен только последний отмеченный элемент формы. Поэтому после имени переменной следует добавить квадратные скобки, чтобы она стала массивом в котором отмечены все вы-
бранные значения. |
|
|
Среднее |
|
<input type="checkbox" |
name="ed[]" |
value="Среднее"> |
|
Среднее специальное |
<input type="checkbox" |
|
name="ed[]" value="Среднее специальное"> |
||
Высшее |
|
<input type="checkbox" |
name="ed[]" |
value="Высшее"> |
|
|
|
16 |
Теперь, если при отправке формы установлены какиелибо значения из этих флажков, будет отправлен массив по имени ed, содержащий любые значения. В любом случае можно извлечь в переменную либо отдельное значение, либо массив значений:
$ed = $_POST[‘ed’];
В табл. 3 приведены все возможные наборы значений для массива $ed[].
Таблица 3 Возможные варианты значений для массива $ed[]
При отправке |
При |
отправке |
При отправке |
одного значения |
двух значений |
трех значений |
|
$ed[0]= "Среднее" |
$ed[0]= "Среднее" |
$ed[0]= "Среднее" |
|
|
$ed[1]= "Среднее |
$ed[1]= "Среднее |
|
|
специальное" |
специальное" |
|
$ed[0]= "Среднее |
$ed[0]= "Среднее" |
$ed[2]= "Высшее" |
|
специальное" |
$ed[1]= "Высшее" |
|
|
$ed[0]= "Высшее" |
$ed[0]= "Среднее |
|
|
|
специальное" |
|
|
|
$ed[1]= "Высшее" |
|
Если переменная $ed является массивом, то для отображения ее содержимого можно использовать очень простой
PHP-код:
foreach($ed as $item) echo "$item<br>";
Расширенный пример программы для работы с фор-
мой
Для более подробной иллюстрации объединения PHPпрограммы с HTML-формой рассмотрим следующий программный код, осуществляющий конвертацию введенного зна-
17
чения температуры по шкале Цельсия в шкалу Фаренгейта и наоборот.
<?php
$f = $c = "";
if (isset($_POST['f'])) $f = sanitizeString($_POST['f']); if (isset($_POST['c'])) $c = sanitizeString($_POST['c']);
if ($f !='')
{
$c = intval((5 / 9) * ($f - 32)); $out = "$f F равно $c C";
}
elseif($c !='')
{
$f = intval((9 / 5) * $c + 32); $out = "$c C равно $f F";
}
else $out = "";
echo <<<_END <html>
<head>
<title>Программа перевода температуры</title>
</head>
<body>
<pre>
Введите температуру по Фаренгей-
ту
или по Цельсию и щелкните по кнопке Перевести
<b>$out</b>
18