Обойти затирание файлов с таким же именем, при загрузке файла на сервер

Помогите, пожалуйста, код, представленный ниже работает и загружает файлы на сервер, но если загружать файл, и файл с таким же именем уже есть на сервере, то он просто перезапишет его. Какой код надо добавить, что на сервере сохранялись все загруженные файлы, без перезаписи файлов с одинаковыми именами?


if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES['files'])) {
        $errors = [];
        $path = 'uploads/';
        $extensions = ['jpg', 'jpeg', 'png', 'gif'];

        $all_files = count($_FILES['files']['tmp_name']);

        for ($i = 0; $i < $all_files; $i++) {
            $file_name = $_FILES['files']['name'][$i];
            $file_tmp = $_FILES['files']['tmp_name'][$i];
            $file_type = $_FILES['files']['type'][$i];
            $file_size = $_FILES['files']['size'][$i];
            $file_ext = strtolower(end(explode('.', $_FILES['files']['name'][$i])));

            $file = $path . $file_name;

            if (!in_array($file_ext, $extensions)) {
                $errors[] = 'Extension not allowed: ' . $file_name . ' ' . $file_type;
            }

            if ($file_size > 2097152) {
                $errors[] = 'File size exceeds limit: ' . $file_name . ' ' . $file_type;
            }

            if (empty($errors)) {
                move_uploaded_file($file_tmp, $file);
            }
        }

        if ($errors) print_r($errors);
    }
}```

Ответы (1 шт):

Автор решения: Yakoffka

попробуйте использовать этот код:

if (($_SERVER['REQUEST_METHOD'] === 'POST') && isset($_FILES['files'])) {
    $errors = [];
    $path = 'uploads/';
    $extensions = ['jpg', 'jpeg', 'png', 'gif'];

    $all_files = count($_FILES['files']['tmp_name']);

    for ($i = 0; $i < $all_files; $i++) {
        $file_name = $_FILES['files']['name'][$i];
        $file_tmp = $_FILES['files']['tmp_name'][$i];
        $file_type = $_FILES['files']['type'][$i];
        $file_size = $_FILES['files']['size'][$i];
        $array = explode('.', $file_name);
        $file_ext = strtolower(end($array));

        $file = $path . $file_name;

        if (!in_array($file_ext, $extensions)) {
            $errors[] = 'Extension not allowed: ' . $file_name . ' ' . $file_type;
        }

        if ($file_size > 2097152) {
            $errors[] = 'File size exceeds limit: ' . $file_name . ' ' . $file_type;
        }

        while (file_exists($file)) {
            $file = $path . time() . $file_ext;
        }

        if (empty($errors)) {
            move_uploaded_file($file_tmp, $file);
        }
    }

    if ($errors) {
        print_r($errors);
    }
}

при наличии в целевой директории файла с идентичным именем текущий файл сохранится с именем, использующим текущую метку времени 1590352305.jpg

→ Ссылка