Загрузка файлов

Загрузка файлов на сервер происходит методом 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 Максимальный суммарный размер загружаемых файлов