false, 'message' => 'You do not have permission to perform this action.']); exit; } header('Content-Type: application/json'); $response = [ 'success' => false, 'message' => 'An unknown error occurred.', 'path' => null ]; $uploadDir = '../data/images/backgrounds/'; // Create directory if it doesn't exist if (!is_dir($uploadDir)) { if (!mkdir($uploadDir, 0755, true)) { http_response_code(500); $response['message'] = 'Failed to create upload directory.'; echo json_encode($response); exit; } } if (isset($_FILES['background']) && $_FILES['background']['error'] === UPLOAD_ERR_OK) { $file = $_FILES['background']; $tabId = isset($_POST['tab_id']) ? intval($_POST['tab_id']) : 0; // --- Validation --- // Size check (e.g., 5MB limit) if ($file['size'] > 5 * 1024 * 1024) { http_response_code(400); $response['message'] = 'File is too large. Maximum size is 5MB.'; echo json_encode($response); exit; } // Type check $allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; $fileInfo = finfo_open(FILEINFO_MIME_TYPE); $mimeType = finfo_file($fileInfo, $file['tmp_name']); finfo_close($fileInfo); if (!in_array($mimeType, $allowedTypes)) { http_response_code(400); $response['message'] = 'Invalid file type. Only JPG, PNG, GIF, and WEBP are allowed.'; echo json_encode($response); exit; } // --- File Processing --- // Find and delete any existing background for this tab $existing_files = glob($uploadDir . 'tab_' . $tabId . '.*'); foreach ($existing_files as $file_to_delete) { unlink($file_to_delete); } $extension = pathinfo($file['name'], PATHINFO_EXTENSION); $fileName = 'tab_' . $tabId . '.' . $extension; $destination = $uploadDir . $fileName; if (move_uploaded_file($file['tmp_name'], $destination)) { $response['success'] = true; $response['message'] = 'File uploaded successfully.'; // Return the path relative to the project root with a cache-busting query string $response['path'] = 'data/images/backgrounds/' . $fileName . '?v=' . time(); } else { http_response_code(500); $response['message'] = 'Failed to move uploaded file.'; } } else { http_response_code(400); switch ($_FILES['background']['error'] ?? UPLOAD_ERR_NO_FILE) { case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: $response['message'] = 'File is too large.'; break; case UPLOAD_ERR_NO_FILE: $response['message'] = 'No file was uploaded.'; break; default: $response['message'] = 'An error occurred during upload.'; break; } } echo json_encode($response);