Добавление файлового менеджера в админпанель PHP

Раздел: Веб-разработка -> Файловый менеджер

Обзор файловых менеджеров для админки на PHP

Файловый менеджер в административной панели - это инструмент, позволяющий управлять файлами сервера: загружать, редактировать, удалять, переименовывать. Рассмотрим несколько реализаций от простого самописного скрипта до профессиональных библиотек.

Как интегрировать мощный файловый менеджер elFinder в админку на PHP?

elFinder - это веб-файловый менеджер с открытым исходным кодом, написанный на jQuery и PHP. Он предоставляет полноценный интерфейс с drag-and-drop, превью, редактором изображений и правами доступа.

  1. Скачайте elFinder с официального сайта или через Composer: composer require studio-42/elfinder.
  2. Разместите файлы в папке вашего проекта (например, /elFinder/).
  3. Создайте PHP-скрипт подключения (connector.php), который обрабатывает запросы от клиента.
  4. В админке вставьте HTML с привязкой к эл-ту: <div id="elfinder"></div> и инициализируйте JavaScript.

Пример простого connector.php:


<?php
require_once __DIR__ . '/vendor/autoload.php';

// Определяем корневую директорию для пользователя
$rootDir = __DIR__ . '/user_files';

$opts = [
    'roots' => [
        [
            'driver'        => 'LocalFileSystem',
            'path'          => $rootDir,
            'URL'           => '/user_files/',
            'accessControl' => 'access' // функция проверки прав
        ]
    ]
];

// запускаем elFinder
$connector = new \elFinder\Connector(new \elFinder($opts));
$connector->run();
  

Fileman admin php (файловый менеджер в админке php)

Проблемы: права на запись, установка PHP-расширения fileinfo, конфликты с сессиями. Решение - проверять права на папки (chmod 755/644) и настроить путь к сессии.

Ошибка: “elFinder: Cannot connect to backend”. Чаще всего из-за неправильного пути или отсутствия прав на папку. Убедитесь, что connector.php доступен и возвращает JSON.

Как реализовать простой файловый менеджер средствами PHP (без библиотек)?

Вариант: написать скрипт, который сканирует директорию, выводит список файлов, обрабатывает загрузку, удаление. Вопрос: «Как сделать базовую панель управления файлами без внешних зависимостей?»


<?php
$dir = __DIR__ . '/uploads';
$files = scandir($dir);
foreach ($files as $file) {
    if ($file === '.' || $file === '..') continue;
    echo "<a href='?delete=" . urlencode($file) . "'>Удалить</a> " . htmlspecialchars($file) . "<br>";
}
if ($_GET['delete'] ?? false) {
    $filePath = $dir . '/' . basename($_GET['delete']);
    if (file_exists($filePath)) unlink($filePath);
    header('Location: ' . $_SERVER['PHP_SELF']);
    exit;
}
  

Проблема: отсутствие проверки безопасности (path traversal). Злоумышленник может передать ?delete=../../etc/passwd. Решение - использовать realpath() и проверять, что файл находится внутри разрешённой директории.

Типичная ошибка: Загрузка файла с опасным расширением (php, phtml). Фильтруйте расширения через pathinfo($filename, PATHINFO_EXTENSION) и не допускайте опасные типы, либо переименовывайте файлы без расширения исполнения.

Как добавить FTP-файловый менеджер в админку?

Если файлы расположены на удалённом сервере, используйте встроенные функции PHP FTP. Вопрос: «Как управлять файлами по FTP через веб-интерфейс?»

Пример подключения и получения списка файлов:


$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if (!$login_result) { echo "Не удалось подключиться"; exit; }
$contents = ftp_nlist($conn_id, $remote_dir);
foreach ($contents as $file) {
    echo htmlspecialchars($file) . "<br>";
}
ftp_close($conn_id);
  

Проблемы: пассивный режим, таймауты, кодировка имён файлов. Решение - установить ftp_pasv($conn_id, true) и работать с UTF-8 через ftp_raw(), если сервер не поддерживает.

Ошибка: FTP-соединение разрывается при долгом простое. Увеличьте таймаут через ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 120).

Как организовать файловый менеджер с редактором кода (CodeMirror)?

Если нужно редактировать PHP, JS, HTML прямо в админке, можно объединить файловое дерево (например, elFinder) с текстовым редактором CodeMirror. Вопрос: «Как сделать встроенный редактор кода для файлов?»

Инициализация codeMirror на текстовом поле:


<textarea id="code_editor" name="content"><?php echo $fileContent; ?></textarea>
<script>
  var editor = CodeMirror.fromTextArea(document.getElementById('code_editor'), {
    lineNumbers: true,
    mode: 'application/x-httpd-php',
    theme: 'monokai'
  });
</script>
  

Сохранять изменения через AJAX или форму.

Проблема: Конфликт между CodeMirror и elFinder при загрузке CSS/JS. Используйте отдельный контейнер и не вызывайте оба в одном окне без изоляции.

Как реализовать файловый менеджер на основе AJAX (без перезагрузки)?

Пример: скрипт отображает список папок, клик по папке подгружает содержимое через fetch. Вопрос: «Как сделать асинхронную навигацию по файлам?»


// frontend
function loadDir(path) {
    fetch('ajax.php?dir=' + encodeURIComponent(path))
        .then(response => response.json())
        .then(data => {
            // обновить список файлов
        });
}
// backend (ajax.php)
$dir = $_GET['dir'] ?? '/';
$full = realpath($root . '/' . $dir);
if (strpos($full, $root) !== 0) die('Access denied');
$files = scandir($full);
echo json_encode(array_diff($files, ['.','..']));
  

Не забывайте про обработку ошибок при декодировании JSON и безопасность.

Распространённая ошибка: Кросс-доменные запросы (CORS) при разработке с localhost. Добавьте заголовки Access-Control-Allow-Origin: *.

Расширенные примеры и нюансы

Пример 1: elFinder с ограничением доступа по ролям

Пример

// connector.php с ACL
$opts['roots'] = [
    [
        'driver' => 'LocalFileSystem',
        'path'   => __DIR__ . '/files/admin/',
        'URL'    => '/files/admin/',
        'attributes' => [
            [ 'pattern' => '/\.php$/i', 'read' => false, 'write' => false, 'locked' => true ]
        ]
    ]
];
if ($_SESSION['role'] === 'editor') {
    $opts['roots'][0]['path'] = __DIR__ . '/files/editor/';
}

Результат: администратор видит все файлы, редактор - только свою директорию, PHP-файлы скрыты.

Пример 2: загрузка файла с проверкой MIME-типа и размера (без библиотек)

Пример

$allowedMime = ['image/jpeg','image/png','application/pdf'];
$maxSize = 10 * 1024 * 1024; // 10 MB
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    if ($file['size'] > $maxSize) die('Файл слишком большой');
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $file['tmp_name']);
    if (!in_array($mime, $allowedMime)) die('Недопустимый тип файла');
    $dest = __DIR__ . '/uploads/' . basename($file['name']);
    move_uploaded_file($file['tmp_name'], $dest);
    echo 'Загружено: ' . $file['name'];
}

Результат: защита от загрузки опасных файлов.

Пример 3: изменение прав доступа через FTP-менеджер

Пример

// Изменение прав на папку
$remote_path = '/public_html/uploads';
if (ftp_chmod($conn_id, 0755, $remote_path)) {
    echo "Права успешно изменены";
} else {
    echo "Ошибка изменения прав";
}

Результат: возможность управлять chmod из веб-интерфейса.

Пример 4: интеграция файлового менеджера в TinyMCE

Пример

// В настройках TinyMCE
file_picker_callback: function(callback, value, meta) {
    // открыть окно файлового менеджера (например, elFinder)
    tinymce.activeEditor.windowManager.openUrl({
        url: '/path/to/elfinder/tinymce_popup.php',
        title: 'Файловый менеджер',
        width: 800,
        height: 600
    });
}

Результат: пользователь может выбирать и вставлять изображения прямо из менеджера.

Пример 5: редактирование файла с использованием CodeMirror и сохранение через AJAX

Пример

// Сохранение изменений
function saveFile(path, content) {
    fetch('save.php', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({file: path, content: content})
    }).then(r => alert('Сохранено'));
}
// Файл save.php
$data = json_decode(file_get_contents('php://input'), true);
$filePath = realpath($root . '/' . $data['file']);
if (strpos($filePath, $root) !== 0) die('Access denied');
file_put_contents($filePath, $data['content']);
echo json_encode(['success' => true]);

Результат: мгновенное сохранение без перезагрузки.

Файловый менеджер в админке PHP - comments

En
Fileman admin php (php)