Эта функция позволяет людям загружать как текстовые, так и двоичные файлы. Благодаря функциям аутентификации и работы с файлами в PHP у вас есть полный контроль над тем, кому разрешено загружать и что делать с файлом после его загрузки.

Пример #1 Форма загрузки файла

Экран загрузки файла можно построить, создав специальную форму, которая выглядит примерно так:


<form enctype="multipart/form-data" action="__URL__" method="POST">

    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />

    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

В __URL__приведенном выше примере следует заменить и указать на файл PHP.

Скрытое MAX_FILE_SIZEполе (измеряемое в байтах) должно предшествовать полю ввода файла, и его значением является максимальный размер файла, принимаемый PHP. Этот элемент формы следует использовать всегда, так как он избавляет пользователей от необходимости ждать передачи большого файла только для того, чтобы обнаружить, что он слишком велик и передача не удалась. Имейте в виду: обмануть этот параметр на стороне браузера довольно легко, поэтому никогда не полагайтесь на то, что файлы большего размера будут заблокированы этой функцией. Это просто удобная функция для пользователей на стороне клиента приложения. Однако настройки PHP (на стороне сервера) для максимального размера не могут быть обмануты.

Примечание :

Убедитесь, что ваша форма загрузки файла имеет атрибут, enctype="multipart/form-data" иначе загрузка файла не будет работать.

Глобальный $_FILES будет содержать всю информацию о загруженном файле. Его содержание из примера формы выглядит следующим образом. Обратите внимание, что это предполагает использование имени для загрузки файла userfile , как в приведенном выше примере скрипта. Это может быть любое имя.

$_FILES['userfile']['name']

Исходное имя файла на клиентской машине.

$_FILES['userfile']['type']

Mime-тип файла, если браузер предоставил эту информацию. Примером будет "image/gif". Однако этот тип mime не проверяется на стороне PHP и поэтому не принимает его значение как должное.

$_FILES['userfile']['size']

Размер загруженного файла в байтах.

$_FILES['userfile']['tmp_name']

Временное имя файла, в котором загруженный файл был сохранен на сервере.

$_FILES['userfile']['error']

Код ошибки, связанный с этой загрузкой файла.

$_FILES['userfile']['full_path']

Полный путь, представленный браузером. Это значение не всегда содержит реальную структуру каталогов, и ему нельзя доверять. Доступно с PHP 8.1.0.

Файлы по умолчанию будут храниться во временном каталоге сервера по умолчанию, если в директиве upload_tmp_dir в php.ini не указано другое место . Каталог сервера по умолчанию можно изменить, установив переменную среды TMPDIR в среде, в которой работает PHP. Установка его с помощью putenv() из скрипта PHP не будет работать. Эту переменную среды также можно использовать, чтобы убедиться, что другие операции также работают с загруженными файлами.

Пример #2 Проверка загрузки файлов

См. также записи функций для is_uploaded_file() и move_uploaded_file() для получения дополнительной информации. В следующем примере будет обработана загрузка файла из формы.

<?php
$uploaddir = '/var/www/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";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

PHP-скрипт, который получает загруженный файл, должен реализовать любую логику, необходимую для определения того, что следует делать с загруженным файлом. Например, вы можете использовать переменную $_FILES['userfile']['size'] для удаления любых файлов, которые слишком малы или слишком велики. Вы можете использовать переменную $_FILES['userfile']['type'] для удаления любых файлов, которые не соответствуют определенному критерию типа, но используйте это только в качестве первой из серии проверок, потому что это значение полностью находится под контроль клиента и не проверяется на стороне PHP. Кроме того, вы можете использовать $_FILES['userfile']['error'] и планировать свою логику в соответствии с кодами ошибок .. Какой бы ни была логика, вы должны либо удалить файл из временного каталога, либо переместить его в другое место.

Если в вашей форме не выбран ни один файл для загрузки, PHP вернет $_FILES['userfile']['size'] как 0, а $_FILES['userfile']['tmp_name'] — как none.

Файл будет удален из временного каталога в конце запроса, если он не был перемещен или переименован.

Пример #3 Загрузка массива файлов

PHP поддерживает функцию массива HTML даже с файлами.

<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        // basename() may prevent filesystem traversal attacks;
        // further validation/sanitation of the filename may be appropriate
        $name = basename($_FILES["pictures"]["name"][$key]);
        move_uploaded_file($tmp_name, "data/$name");
    }
}
?>