Обработка загрузки файлов
Безопасно обрабатывайте загруженные файлы с помощью суперглобальной переменной _FILES
«Обработка загрузки файлов» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Обзор загрузки файлов в PHP
PHP обрабатывает загрузку файлов через суперглобальную переменную $_FILES. Форма должна использовать method="POST" и enctype="multipart/form-data".
Форма загрузки HTML
Настройка HTML-формы для загрузки одного или нескольких файлов:
<!-- Single file -->
<form method="POST" action="upload.php"
enctype="multipart/form-data">
<input type="file" name="document">
<button>Upload</button>
</form>
<!-- Multiple files -->
<form method="POST" enctype="multipart/form-data">
<input type="file" name="photos[]" multiple>
<button>Upload All</button>
</form>Структура $_FILES
Для каждого загруженного файла в $_FILES есть пять элементов:
<?php
$file = $_FILES['document'];
echo $file['name']; // original name: report.pdf
echo $file['type']; // browser-reported MIME: application/pdf
echo $file['tmp_name']; // server temp path: /tmp/phpXXXXXX
echo $file['error']; // error code: 0 = UPLOAD_ERR_OK
echo $file['size']; // file size in bytesКоды ошибок загрузки
Всегда проверяйте $file['error'] перед обработкой:
<?php
$errorMessages = [
UPLOAD_ERR_INI_SIZE => 'Exceeds upload_max_filesize in php.ini',
UPLOAD_ERR_FORM_SIZE => 'Exceeds MAX_FILE_SIZE in form',
UPLOAD_ERR_PARTIAL => 'Only partially uploaded',
UPLOAD_ERR_NO_FILE => 'No file uploaded',
UPLOAD_ERR_NO_TMP_DIR => 'Missing temp folder',
UPLOAD_ERR_CANT_WRITE => 'Failed to write to disk',
UPLOAD_ERR_EXTENSION => 'PHP extension stopped upload',
];
$err = $_FILES['doc']['error'];
if ($err !== UPLOAD_ERR_OK) {
die($errorMessages[$err] ?? 'Unknown error');
}Безопасная проверка типа файла
Никогда не доверяйте указанному браузером типу MIME — проверяйте фактическое содержимое файла:
<?php
$tmp = $_FILES['image']['tmp_name'];
$allowed = ['image/jpeg', 'image/png', 'image/webp'];
// Check real MIME type from file content
$realMime = mime_content_type($tmp);
if (!in_array($realMime, $allowed)) {
die('Invalid file type: ' . $realMime);
}Проверка размера файла
Устанавливайте ограничения размера на стороне сервера, даже если HTML-форма содержит скрытое поле MAX_FILE_SIZE:
<?php
$maxBytes = 5 * 1024 * 1024; // 5MB
$size = $_FILES['video']['size'];
if ($size > $maxBytes) {
$mb = round($size / 1024 / 1024, 2);
die("File too large: {$mb}MB (max 5MB)");
}is_uploaded_file и move_uploaded_file
Всегда используйте эти две функции, чтобы подтвердить загрузку файла через HTTP и безопасно переместить его:
<?php
$tmp = $_FILES['photo']['tmp_name'];
$dest = '/var/www/uploads/' . basename($_FILES['photo']['name']);
if (!is_uploaded_file($tmp)) {
die('Not an uploaded file — possible attack');
}
if (!move_uploaded_file($tmp, $dest)) {
die('Failed to move uploaded file');
}
echo 'Upload saved to: ' . $dest;Создание безопасных имён файлов
Создавайте случайное имя файла, чтобы предотвратить обход каталогов и атаки с перезаписью файлов:
<?php
$originalName = $_FILES['doc']['name'];
$ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
$allowedExts = ['jpg', 'jpeg', 'png', 'pdf'];
if (!in_array($ext, $allowedExts)) {
die('File type not allowed');
}
$safeName = bin2hex(random_bytes(16)) . '.' . $ext;
$dest = '/var/www/uploads/' . $safeName;
move_uploaded_file($_FILES['doc']['tmp_name'], $dest);Обработка загрузки нескольких файлов
При использовании name="photos[]" переменная $_FILES содержит массивы — перебирайте их:
<?php
$files = $_FILES['photos'];
$count = count($files['name']);
for ($i = 0; $i < $count; $i++) {
if ($files['error'][$i] !== UPLOAD_ERR_OK) continue;
$tmp = $files['tmp_name'][$i];
$ext = pathinfo($files['name'][$i], PATHINFO_EXTENSION);
$dest = '/uploads/' . uniqid() . '.' . strtolower($ext);
move_uploaded_file($tmp, $dest);
echo "Saved: $dest" . PHP_EOL;
}Настройки загрузки в php.ini
Основные директивы php.ini, влияющие на загрузку файлов:
file_uploads = On— включение загрузкиupload_max_filesize = 8M— максимальный размер одного файлаpost_max_size = 32M— максимальный размер тела POST-запроса, должен быть больше upload_max_filesizemax_file_uploads = 20— максимальное число файлов в одном запросе
Изменение размера изображения после загрузки
Используйте библиотеку GD для изменения размера изображений после загрузки:
<?php
function resizeImage(string $src, string $dst, int $maxW): void {
[$w, $h, $type] = getimagesize($src);
$ratio = $maxW / $w;
$newH = (int) ($h * $ratio);
$srcImg = imagecreatefromjpeg($src);
$dstImg = imagecreatetruecolor($maxW, $newH);
imagecopyresampled($dstImg, $srcImg, 0,0,0,0, $maxW, $newH, $w, $h);
imagejpeg($dstImg, $dst, 90);
imagedestroy($srcImg);
imagedestroy($dstImg);
}Быстрая проверка
Какая функция PHP необходима для безопасного перемещения загруженного файла в конечное место назначения?
Повторение: загрузка файлов
Список действий при обработке загрузки:
- форма должна использовать
method=POST enctype=multipart/form-data - проверяйте
$_FILES['field']['error'] === UPLOAD_ERR_OK - проверяйте фактический тип MIME с помощью
mime_content_type() - проверяйте размер файла на стороне сервера
- используйте
move_uploaded_file(), а не rename/copy - создавайте случайные имена файлов, чтобы предотвратить конфликты
Часто задаваемые вопросы
Урок «Обработка загрузки файлов» бесплатный?
Да — полный текст урока «Обработка загрузки файлов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Обработка загрузки файлов»?
Безопасно обрабатывайте загруженные файлы с помощью суперглобальной переменной _FILES Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Обработка загрузки файлов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Чтение файлов с помощью PHP
- Запись и добавление данных в файлы
- Работа с каталогами
- Обработка загрузки файлов