W3docs

move_uploaded_file()

Функция move_uploaded_file() в PHP перемещает загруженный файл в новое постоянное место на сервере. Синтаксис, параметры и примеры.

Что такое функция move_uploaded_file()?

Функция move_uploaded_file() — это встроенная функция PHP, которая перемещает файл, загруженный через HTML-форму, в постоянное место на сервере. Когда браузер загружает файл, PHP сначала сохраняет его во временной директории под случайным именем. Этот временный файл автоматически удаляется после завершения скрипта, поэтому, если нужно его сохранить, необходимо переместить его в постоянное место — именно для этого и предназначена функция move_uploaded_file().

Особенность этой функции — встроенная проверка безопасности. Она перемещает файл только в том случае, если PHP подтверждает, что файл был по-настоящему загружен через HTTP POST-запрос. Это предотвращает ситуацию, когда злоумышленник может обманом заставить скрипт переместить чувствительный серверный файл (например, /etc/passwd), подставив его путь. По этой причине всегда следует использовать move_uploaded_file() вместо copy() или rename() при обработке загрузок.

На этой странице рассматриваются синтаксис, параметры, возвращаемое значение, полный рабочий пример, коды ошибок загрузки и важные нюансы безопасности.

Синтаксис

move_uploaded_file(string $from, string $to): bool
ПараметрОписание
$fromВременное имя загруженного файла. Используйте $_FILES['field']['tmp_name'].
$toПолный путь назначения, включая новое имя файла, куда файл должен быть сохранён.

Возвращаемое значение

move_uploaded_file() возвращает true, если файл успешно перемещён. Возвращает false, если $from не является допустимым загруженным файлом (например, если путь был подделан), или если само перемещение не удалось — обычно из-за отсутствия директории назначения или недостаточных прав на запись. В случае поддельного файла PHP также выдаёт предупреждение, и перемещение не выполняется.

Как использовать функцию move_uploaded_file()?

Использовать функцию move_uploaded_file() несложно. Вот шаги, которые нужно выполнить:

  1. Проверьте успешность загрузки файла, проверив $_FILES['file']['error'].
  2. Укажите путь назначения для файла.
  3. Вызовите функцию move_uploaded_file(), передав временное имя файла и путь назначения.

Вот пример кода, демонстрирующий использование функции move_uploaded_file():

Как использовать функцию move_uploaded_file()?

<?php

if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    $uploaded_file = $_FILES['file']['tmp_name'];
    $destination_path = '/path/to/new/location/' . basename($_FILES['file']['name']);
    if (move_uploaded_file($uploaded_file, $destination_path)) {
        echo "File uploaded successfully!";
    } else {
        echo "Error uploading file.";
    }
} else {
    echo "File upload failed.";
}

В этом примере сначала проверяется успешность загрузки с помощью $_FILES['file']['error']. Затем указывается путь назначения для файла, и используется basename() для безопасного извлечения имени файла, чтобы избежать уязвимостей обхода пути. Наконец, применяется функция move_uploaded_file() для перемещения загруженного файла в новое место. Если файл успешно перемещён, выводится сообщение об успехе. При ошибке перемещения выводится сообщение об ошибке.

Соответствующая HTML-форма должна использовать method="post" и enctype="multipart/form-data", иначе $_FILES будет пустым:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="Upload">
</form>

Атрибут name поля для загрузки файла (file в данном случае) — это ключ, по которому читаются данные из $_FILES.

Коды ошибок загрузки

Значение $_FILES['file']['error'] сообщает, произошла ли ошибка при загрузке и почему. Всегда проверяйте его перед перемещением файла. Наиболее распространённые коды:

КонстантаЗначение
UPLOAD_ERR_OK (0)Загрузка прошла успешно — можно перемещать файл.
UPLOAD_ERR_INI_SIZE (1)Файл превышает значение upload_max_filesize в php.ini.
UPLOAD_ERR_FORM_SIZE (2)Файл превышает значение поля MAX_FILE_SIZE формы.
UPLOAD_ERR_PARTIAL (3)Файл был загружен только частично.
UPLOAD_ERR_NO_FILE (4)Файл не был загружен.

Два параметра сервера часто вызывают незаметные сбои: upload_max_filesize и post_max_size. Если загружаемый файл превышает любой из этих лимитов, $_FILES может прийти пустым или с кодом ошибки — независимо от того, насколько правильно написан PHP-код.

Замечания по безопасности

  • Никогда не доверяйте оригинальному имени файла. Используйте basename() для $_FILES['file']['name'] или, что ещё лучше, генерируйте собственное безопасное имя, чтобы избежать обхода пути вида ../../config.php.
  • Проверяйте тип файла по его фактическому содержимому (например, с помощью finfo / mime_content_type), а не только по расширению — клиент может солгать как о расширении, так и о поле type.
  • По возможности храните загрузки за пределами корня веб-сайта, чтобы пользователи не могли напрямую выполнять загруженные скрипты.
  • Для явной двойной проверки того, что путь является реальным загруженным файлом, см. is_uploaded_file() — хотя move_uploaded_file() уже выполняет эту проверку внутри.

Заключение

Функция move_uploaded_file() — это правильный и безопасный способ перемещения файла, загруженного через HTTP POST, из временной директории PHP в постоянное место. Она возвращает true при успехе и false при неудаче, и отказывается перемещать всё, что не было по-настоящему загружено. Всегда проверяйте код ошибки загрузки, очищайте имя файла назначения и проверяйте файл перед тем, как доверять ему.

Подробнее о работе с загрузками файлов см. в PHP File Upload и в разделе PHP File Handling.

Practice

Практика
Каково правильное использование функции move_uploaded_file() в PHP?
Каково правильное использование функции move_uploaded_file() в PHP?
Was this page helpful?