- •Размещение файлов на сервере
- •Задание
- •Теория и примеры
- •1 Загрузка (upload) файлов на сервер
- •Upload_err_ok – значение: 0. Отсутствие ошибки, признак успешной загрузки файла
- •Upload_err_no_tmp_dir – значение: 6. Отсутствует директория для временного сохранения файла
- •Обработка загруженного файла
- •2 Обработка данных формы
- •3 Работа с файлами
- •Пример 7 Чтение в строку файла с удаленной машине
- •Пример 8 Открытие и запись в файл с контролем ошибок
- •Чтение строки из файла fgets.
- •Достигнут ли конец файла – feof.
- •Смотри примеры № № 5, 7
- •Смотри примеры выше
- •4 Работа с датой и временем
- •5 Регулярные выражения
Upload_err_ok – значение: 0. Отсутствие ошибки, признак успешной загрузки файла
UPLOAD_ERR_INI_SIZE – значение: 1. Размер файла превысил значение, указанное в php.ini
UPLOAD_ERR_FORM_SIZE – значение: 2. Размер файла превысил значение MAX_FILE_SIZE, указанное в HTML форме
UPLOAD_ERR_PARTIAL – значение: 3. Файл загружен частично
UPLOAD_ERR_NO_FILE – значение: 4. Файл не загружен
Upload_err_no_tmp_dir – значение: 6. Отсутствует директория для временного сохранения файла
UPLOAD_ERR_CANT_WRITE – значение: 7. Ошибка при записи файла на диск
Загруженный файл сохраняется во временной директории сервера, если не указано другое место директивой upload_tmp_dir в файле php.ini.
Обработка загруженного файла
Функция
bool is_uploaded_file(sting filename)
проверяет, является ли файл, имя которого передано ей в качестве аргумента загруженным на сервер с помощью протокола HTTP POST. Возвращает true в случае успешной проверки. Функция помогает удостовериться в том, что никакой злоумышленник не заставил Ваш скрипт обрабатывать файл, который ему обрабатывать не положено, например, /etc/passwd
Правильным аргументом для данной функции является имя файла на сервере $_FILES['userfile']['tmp_name'].
В большинстве случаев, после загрузки файла, Вам придется переместить его в директорию для постоянного хранения. Для этих целей можно использовать функцию
bool move_uploaded_file(string filename, string destination),
которая выполняет такую же проверку, как и функция is_uploaded_file() и вдобавок перемещает его в указанное вторым аргументом место.
Пример 2 Обработка файла, загружаемого на сервер
<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES
// should be used instead of $_FILES.
$uploaddir = './uploads/';
$uploadfile = $uploaddir .
basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'],
$uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
print_r($_FILE);
} else {
echo "Possible file upload attack!\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>
PHP скрипт, обрабатывающий загрузку файла на сервер, должен использовать одну из функций is_uploaded_file(), move_uploaded_file(), а также проверять отсутствие ошибок загрузки файла ($_FILES['userfile']['error']). Чтобы Вы не делали с загружаемым файлом, Вам необходимо удалить его после загрузки из временной директории.
Если при отправки данных формы файл не был выбран, значение $_FILES['userfile']['size'] будет равняться 0, а строка $_FILES['userfile']['tmp_name'] будет пустой.
2 Обработка данных формы
Переменные GET-запроса попадают в массив $_GET, переменные POST-запроса – в массив $_POST. Серверные переменные (тип запроса, IP-адрес клиента, именя скрипта и т.д.) – в $_SERVER.
Например, если имеется форма, содержащая 2 текстовых поля для ввода имени пользователя и его электронной почты, причем параметры name обоих полей равны fname и email соответственно, т.е.
<form action=’script.php’ method=’POST’>
<input type=’text’ name=’fname’>
<input type=’text’ name=’email’>
<input type=’submit’ name=’subOk’>
</form> то в скрипте script.php, обрабатывающем запрос формы будет определен глобальный массив $_POST и данные формы будут доступны в виде: $_POST[‘fname’] – значение, введенное пользователем в поле fname, $_POST[‘email’] – значение, введенное пользователем в поле email.
Переменная $_SERVER[‘REQUEST_METHOD’] принимает значение POST или GET в зависимости от типа запроса.
Пример 3 Обработка GET-запроса
Если пользователь ввел данные в форму (установлена переменная $_GET['name']), отображается приветствие. Форма отправляет данные «сама на себя», т.е. адресует их на текущий URL
<html>
<body>
<?
if (isset($_GET['name'])) {
echo '<h1>Привет, <b>' . $_GET['name'] . '</b></h1>!';
}
?>
<form action="<? echo $_SERVER['PHP_SELF']; ?>">
Введите Ваше имя: <input type="text" name="name">
<br>
<input type="submit" value="OK">
</form>
</body>
</html>
Пример 4 Обработка POST запроса
Если пользователь ввел данные в каждое поле, отображается приветствие. Если какое-либо из полей пропущено, предлагается ввести недостающие данные. Обратите внимание, что в этом случае HTML-код генерируется таким образом, что ввод пользователя не теряется (заполняются поля value)
<html>
<body>
<?
$name = isset($_POST['name']) ? $_POST['name'] : '';
$year = isset($_POST['year']) ? $_POST['year'] : '';
if (isset($_POST['name'], $_POST['year'])) {
if ($_POST['name'] == '') {
echo 'Укажите имя!<br>';
} else if ($_POST['year'] < 1900 || $_POST['year'] > 2004) {
echo 'Укажите год рождения! Допустимый диапазон значений:
1900..2004<br>';
} else {
echo 'Здравствуйте, ' . $_POST['name'] . '!<br>';
$age = 2006 - $_POST['year'];
echo 'Вам ' . $age . ' лет<br>';
}
echo '<hr>';
}
?>
<form method="post" action="<? echo $_SERVER['PHP_SELF']; ?>">
Введите Ваше имя: <input type="text" name="name"
value="<? echo $name; ?>">
<br>
Введите Ваш год рождения: <input type="text" name="year"
value="<? echo $year; ?>">
<input type="submit" value="OK">
</form>
</body>
</html>