Операции с файлами на PHP: от загрузки до управления правами
Основные задачи администрирования файлов
Наиболее эффективное решение для администрирования файлов в PHP - использование встроенных функций с последовательной проверкой ошибок. Это не требует дополнительных библиотек и обеспечивает полный контроль над операциями.
// Безопасная загрузка файла
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$uploadDir = '/var/www/uploads/';
$fileName = basename($_FILES['file']['name']);
$targetPath = $uploadDir . $fileName;
$maxSize = 2 * 1024 * 1024; // 2 MB
$allowedTypes = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['file']['type'], $allowedTypes)) {
die('Недопустимый тип файла.');
}
if ($_FILES['file']['size'] > $maxSize) {
die('Файл слишком большой.');
}
if (!is_dir($uploadDir) || !is_writable($uploadDir)) {
die('Директория недоступна для записи.');
}
if (move_uploaded_file($_FILES['file']['tmp_name'], $targetPath)) {
echo 'Файл успешно загружен: ' . htmlspecialchars($fileName);
} else {
echo 'Ошибка загрузки файла.';
}
}
Access admin php (доступ к админке php)
Пояснение: используется basename для предотвращения path traversal, проверка типа и размера, проверка директории. После move_uploaded_file результат проверяется.
Типичные ошибки: игнорирование проверки прав на директорию, забывание про basename, неправильное указание путей. Решение: всегда проверять is_writable и использовать realpath для нормализации.
Как работать с файлами в объектном стиле?
SPL предоставляет классы SplFileObject и SplFileInfo для объектно-ориентированного доступа к файлам.
$file = new SplFileInfo('/path/to/file.txt');
if ($file->isFile()) {
echo 'Размер: ' . $file->getSize() . ' байт';
}
Php управление серверов (управление php сервером)
Этот подход удобен при наследовании и использовании в ООП-фреймворках.
Ошибка: попытка открыть несуществующий файл. Решение: предварительная проверка $file->isFile().
Как создать единый интерфейс для разных хранилищ (локальное, облако)?
Библиотека Flysystem предоставляет абстракцию файловой системы. Устанавливается через composer: composer require league/flysystem.
use League\Flysystem\Filesystem;
use League\Flysystem\Local\LocalFilesystemAdapter;
$adapter = new LocalFilesystemAdapter('/var/www/uploads');
$filesystem = new Filesystem($adapter);
$filesystem->write('newfile.txt', 'Содержимое');
if ($filesystem->fileExists('newfile.txt')) {
echo 'Файл создан.';
}
подключение к серверу php (подключение к серверу в php)
Замена адаптера на S3 или FTP не меняет код. Цель - унификация работы с файлами.
Проблема: зависимость от внешней библиотеки, дополнительные слои абстракции снижают производительность. Решение: использовать Flysystem только если нужна поддержка нескольких хранилищ.
Как управлять файлами на удаленном сервере через PHP?
Расширение FTP позволяет подключаться и передавать файлы.
$conn = ftp_connect('ftp.example.com');
ftp_login($conn, 'user', 'password');
ftp_put($conn, 'remote.txt', 'local.txt', FTP_BINARY);
ftp_close($conn);
Admin file php (администрирование файлов в php)
Используется для синхронизации, автоматических бэкапов.
Ошибка: пассивный режим не включен - файлы не передаются. Решение: ftp_pasv($conn, true).
Как обрабатывать изображения при загрузке в админке?
GD или Imagick для изменения размера, наложения водяных знаков.
$src = imagecreatefromjpeg('photo.jpg');
$dst = imagescale($src, 200, 150);
imagejpeg($dst, 'thumb.jpg');
imagedestroy($src);
imagedestroy($dst);
Php admin module (административный модуль php)
Цель: создание миниатюр, оптимизация размера.
Ошибка: нехватка памяти на больших изображениях. Решение: увеличить memory_limit или использовать Imagick с потоковой обработкой.
Как предотвратить атаки при администрировании файлов?
Использовать basename, проверку MIME-типа, ограничение на расширения, удаление PHP-кода из загруженных файлов.
$ext = pathinfo($fileName, PATHINFO_EXTENSION);
$allowedExt = ['jpg','png','pdf'];
if (!in_array(strtolower($ext), $allowedExt)) {
die('Расширение не разрешено.');
}
Также рекомендуется хранить загруженные файлы вне document root или использовать .htaccess для ограничения выполнения.
Ошибка: проверка только расширения без проверки содержимого - можно загрузить PHP-файл с переименованным расширением. Решение: проверять MIME-тип через finfo_file.
Расширенные примеры администрирования файлов
/* Скрипт массового удаления файлов старше 30 дней */
$dir = '/var/www/logs';
$files = scandir($dir);
$cutoff = time() - 30 * 24 * 3600;
foreach ($files as $file) {
$path = $dir . DIRECTORY_SEPARATOR . $file;
if (is_file($path) && filemtime($path) < $cutoff) {
unlink($path) or error_log('Не удалось удалить ' . $path);
}
}
Файлы старше 30 дней удалены (ошибки в логе).
/* Создание архива и скачивание */
$zip = new ZipArchive();
$zip->open('backup.zip', ZipArchive::CREATE);
$zip->addFile('file1.txt', 'backup/file1.txt');
$zip->close();
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="backup.zip"');
readfile('backup.zip');
unlink('backup.zip');
Браузер скачивает архив.
/* Рекурсивное копирование директории */
function copyDir($src, $dst) {
$dir = opendir($src);
@mkdir($dst);
while(($file = readdir($dir)) !== false) {
if ($file != '.' && $file != '..') {
if (is_dir($src . '/' . $file)) {
copyDir($src . '/' . $file, $dst . '/' . $file);
} else {
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
}
copyDir('/var/www/site', '/backup/site');
Директория скопирована рекурсивно.
/* Логирование операций с файлами */
function logFileOperation($action, $file, $result) {
$logEntry = date('Y-m-d H:i:s') . ' [' . $action . '] ' . $file . ' -> ' . $result . PHP_EOL;
file_put_contents('/var/log/file_admin.log', $logEntry, FILE_APPEND | LOCK_EX);
}
logFileOperation('upload', 'photo.jpg', 'success');
В лог добавляется строка.
/* Проверка и изменение прав доступа */
$path = 'config.php';
if (file_exists($path)) {
if (is_readable($path) === false) {
chmod($path, 0644);
echo 'Права изменены на 0644';
}
}
Если файл нечитаем, права меняются.