Загрузка файлов
Загрузка файлов на сервер происходит методом POST.
Примерный вид формы для загрузки файлов:
<form enctype="multipart/form-data" action="__URL__" method="POST"> Отправить этот файл: <input name="userfile" type="file" /> <input type="submit" value="Send File" /></form>
Параметр enctype формы задает тип отправляемых данных, по умолчанию = application/x-www-form-urlencoded, при котором данные кодируются таким же образом, как GET-запрос (var1=val1&var2=val2&…). Для передачи файлов необходимо обязательно использовать multipart/form-data.
Все принятые файлы принимаются веб-сервером автоматически и сохраняются во временной папке, (эта папка может быть переобозначена в php.ini при помощи директивы upload_tmp_dir). За дальнейшую обработку файлов полностью отвечает ваш скрипт. По окончанию работы скрипта временные файлы будут удалены.
Информация о принятых файлах хранится в суперглобальном массиве $_FILES (уст. $HTTP_POST_FILES):
$_FILES['userfile']['name']
Оригинальное имя файла на компьютере клиента.
$_FILES['userfile']['type']
Mime-тип файла, в случае, если браузер предоставил такую информацию. Пример: "image/gif". Этот mime-тип не проверяется в PHP, так что не полагайтесь на его значение без проверки.
$_FILES['userfile']['size']
Размер в байтах принятого файла. 0, если файл не был загружен.
$_FILES['userfile']['tmp_name']
Временное имя, с которым принятый файл был сохранен на сервере.
$_FILES['userfile']['error']
Код ошибки, которая может возникнуть при загрузке файла (PHP 4.2.0+).
bool is_uploaded_file ( string $filename ) – проверяет, был ли успешно загружен файл. Для правильной работы, функции is_uploaded_file() нужен аргумент вида $_FILES['userfile']['tmp_name'], имя закачиваемого файла на клиентской машине $_FILES['userfile']['name'] не подходит.
bool move_uploaded_file ( string $filename , string $destination ) – пытается переместить загруженный файл в указанное место. Если файл не является загруженным или не может быть перемещен, возвращает false.
Пример:
$uploadfile = '/var/www/uploads/' . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "Файл корректен и был успешно загружен.\n";
} else {
echo "Возможная атака с помощью файловой загрузки!\n";
}
echo 'Некоторая отладочная информация:'; print_r($_FILES);
print "</pre>";
PHP поддерживает возможность передачи из форм HTML массивов данных, в том числе и с файлами. Это будет выглядит примерно так:
В HTML: <input type="file" name="pictures[]">В PHP: $_FILES['userfile']['name'][0], $_FILES['userfile']['name'][1], …
Директивы php.ini :
Имя | По умолчанию | |
file_uploads | "1" | Разрешена ли загрузка файлов |
upload_tmp_dir | NULL | Расположение временной папки |
max_input_nesting_level | Максимальный уровень вложенности переменных | |
max_input_vars | Максимальное количество передаваемых запросом переменных | |
upload_max_filesize | "2M" | Максимальный размер загружаемого файла |
max_file_uploads | Максимальный суммарный размер загружаемых файлов |