Добавление файлового менеджера в админпанель PHP
Обзор файловых менеджеров для админки на PHP
Файловый менеджер в административной панели - это инструмент, позволяющий управлять файлами сервера: загружать, редактировать, удалять, переименовывать. Рассмотрим несколько реализаций от простого самописного скрипта до профессиональных библиотек.
Как интегрировать мощный файловый менеджер elFinder в админку на PHP?
elFinder - это веб-файловый менеджер с открытым исходным кодом, написанный на jQuery и PHP. Он предоставляет полноценный интерфейс с drag-and-drop, превью, редактором изображений и правами доступа.
- Скачайте elFinder с официального сайта или через Composer:
composer require studio-42/elfinder. - Разместите файлы в папке вашего проекта (например,
/elFinder/). - Создайте PHP-скрипт подключения (connector.php), который обрабатывает запросы от клиента.
- В админке вставьте 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]);
Результат: мгновенное сохранение без перезагрузки.