$site_password, 'created' => time(), 'filename' => $file_name, 'original_name' => $custom_url ]; file_put_contents($meta_path, json_encode($metadata)); $website_url = getWebsiteUrl($custom_url, $user_id); $_SESSION['success'] = "File uploaded successfully!"; $_SESSION['file_url'] = $website_url; $_SESSION['file_name'] = $file_name; } else { $_SESSION['error'] = "Error uploading file. Check folder permissions."; } } } } else { $_SESSION['error'] = "Only HTML, CSS, JavaScript, and ZIP files are allowed."; } } else { $_SESSION['error'] = "File upload error. Please try again. Error code: " . $file['error']; } } // Code editor upload elseif (isset($_POST['html_code'])) { $html_code = $_POST['html_code']; $custom_url = trim($_POST['code_custom_url']) ?: generateCustomUrl('my-website'); $site_password = trim($_POST['code_site_password']) ?: ''; if (!empty($html_code)) { if (!is_dir($user_dir)) { mkdir($user_dir, 0777, true); } $custom_url = cleanCustomUrl($custom_url); $file_path = $user_dir . '/' . $custom_url . '.html'; $meta_path = $user_dir . '/' . $custom_url . '.json'; // Check if URL already exists if (file_exists($file_path)) { $_SESSION['error'] = "This URL is already taken. Please choose a different one."; } else { if (file_put_contents($file_path, $html_code)) { // Save metadata $metadata = [ 'password' => $site_password, 'created' => time(), 'filename' => $custom_url . '.html', 'original_name' => $custom_url ]; file_put_contents($meta_path, json_encode($metadata)); $website_url = getWebsiteUrl($custom_url, $user_id); $_SESSION['success'] = "Website created successfully!"; $_SESSION['file_url'] = $website_url; $_SESSION['file_name'] = $custom_url . '.html'; } else { $_SESSION['error'] = "Error creating file. Check folder permissions."; } } } else { $_SESSION['error'] = "Please enter HTML code."; } } // Handle site deletion elseif (isset($_POST['delete_site'])) { $site_to_delete = $_POST['delete_site']; deleteSite($site_to_delete, $user_id); $_SESSION['success'] = "Site deleted successfully!"; } // Handle site renaming elseif (isset($_POST['rename_site'])) { $old_name = $_POST['old_name']; $new_name = cleanCustomUrl($_POST['new_name']); if (renameSite($old_name, $new_name, $user_id)) { $_SESSION['success'] = "Site renamed successfully!"; } else { $_SESSION['error'] = "Error renaming site. Name might be taken."; } } // Handle password update elseif (isset($_POST['update_password'])) { $site_name = $_POST['site_name']; $new_password = $_POST['new_password']; if (updateSitePassword($site_name, $new_password, $user_id)) { $_SESSION['success'] = "Password updated successfully!"; } else { $_SESSION['error'] = "Error updating password."; } } header("Location: index.php"); exit; } // Handle ZIP file upload and extraction function handleZipUpload($zip_tmp, $custom_url, $user_id, $password) { if (!class_exists('ZipArchive')) { return ['success' => false, 'message' => 'ZIP extraction not supported on this server.']; } $zip = new ZipArchive(); $result = ['success' => false, 'message' => '']; if ($zip->open($zip_tmp) === TRUE) { $extract_path = 'sites/' . $user_id . '/' . $custom_url; // Create directory for extracted files if (!is_dir($extract_path)) { mkdir($extract_path, 0777, true); } $allowed_extensions = ['html', 'htm', 'css', 'js', 'txt']; $has_html = false; $extracted_files = []; // Extract allowed files only for ($i = 0; $i < $zip->numFiles; $i++) { $filename = $zip->getNameIndex($i); $file_ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); // Skip directories and non-allowed files if (substr($filename, -1) === '/' || !in_array($file_ext, $allowed_extensions)) { continue; } // Extract file $file_content = $zip->getFromIndex($i); $safe_filename = basename($filename); if ($file_content !== false) { file_put_contents($extract_path . '/' . $safe_filename, $file_content); $extracted_files[] = $safe_filename; if ($file_ext === 'html' || $file_ext === 'htm') { $has_html = true; } } } $zip->close(); if ($has_html) { // Save metadata for ZIP site $meta_path = 'sites/' . $user_id . '/' . $custom_url . '.json'; $metadata = [ 'password' => $password, 'created' => time(), 'filename' => $custom_url, 'original_name' => $custom_url, 'is_zip' => true, 'files' => $extracted_files ]; file_put_contents($meta_path, json_encode($metadata)); $result['success'] = true; $result['message'] = count($extracted_files) . " files extracted successfully."; } else { // Clean up if no HTML file found array_map('unlink', glob("$extract_path/*")); rmdir($extract_path); $result['message'] = "ZIP file must contain at least one HTML file."; } } else { $result['message'] = "Failed to open ZIP file."; } return $result; } // Generate custom URL from filename function generateCustomUrl($filename) { $name = pathinfo($filename, PATHINFO_FILENAME); $name = preg_replace('/[^a-z0-9]/', '-', strtolower($name)); $name = preg_replace('/-+/', '-', $name); $name = trim($name, '-'); return $name ?: 'my-site'; } // Clean custom URL function cleanCustomUrl($url) { $url = preg_replace('/[^a-z0-9-]/', '', strtolower($url)); $url = preg_replace('/-+/', '-', $url); $url = trim($url, '-'); return $url ?: 'my-site'; } // Get website full URL function getWebsiteUrl($path, $user_id) { $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST']; $base_url = $protocol . '://' . $host . dirname($_SERVER['PHP_SELF']); return rtrim($base_url, '/') . '/view.php?site=' . $path . '&user=' . $user_id; } // Delete site function deleteSite($site_name, $user_id) { $base_path = 'sites/' . $user_id . '/'; // Check if it's a ZIP site (directory) $dir_path = $base_path . $site_name; if (is_dir($dir_path)) { // Delete all files in directory array_map('unlink', glob("$dir_path/*.*")); rmdir($dir_path); // Delete metadata $meta_file = $base_path . $site_name . '.json'; if (file_exists($meta_file)) { unlink($meta_file); } } else { // Delete single file with all extensions $extensions = ['html', 'htm', 'css', 'js', 'json']; foreach ($extensions as $ext) { $file_path = $base_path . $site_name . '.' . $ext; if (file_exists($file_path)) { unlink($file_path); } } } return true; } // Rename site function renameSite($old_name, $new_name, $user_id) { $base_path = 'sites/' . $user_id . '/'; // Check if new name already exists $new_meta = $base_path . $new_name . '.json'; if (file_exists($new_meta)) { return false; } // Check if it's a ZIP site $old_dir = $base_path . $old_name; if (is_dir($old_dir)) { $new_dir = $base_path . $new_name; if (!rename($old_dir, $new_dir)) { return false; } // Rename metadata file $old_meta = $base_path . $old_name . '.json'; if (file_exists($old_meta)) { rename($old_meta, $new_meta); // Update metadata $metadata = json_decode(file_get_contents($new_meta), true); $metadata['filename'] = $new_name; $metadata['original_name'] = $new_name; file_put_contents($new_meta, json_encode($metadata)); } } else { // Rename single file $extensions = ['html', 'htm', 'css', 'js']; $renamed = false; foreach ($extensions as $ext) { $old_file = $base_path . $old_name . '.' . $ext; if (file_exists($old_file)) { $new_file = $base_path . $new_name . '.' . $ext; if (!rename($old_file, $new_file)) { return false; } $renamed = true; break; } } if ($renamed) { // Rename metadata $old_meta = $base_path . $old_name . '.json'; $new_meta = $base_path . $new_name . '.json'; if (file_exists($old_meta)) { rename($old_meta, $new_meta); // Update metadata $metadata = json_decode(file_get_contents($new_meta), true); $metadata['filename'] = $new_name . '.' . pathinfo($new_file, PATHINFO_EXTENSION); $metadata['original_name'] = $new_name; file_put_contents($new_meta, json_encode($metadata)); } } } return true; } // Update site password function updateSitePassword($site_name, $new_password, $user_id) { $meta_path = 'sites/' . $user_id . '/' . $site_name . '.json'; if (file_exists($meta_path)) { $metadata = json_decode(file_get_contents($meta_path), true); $metadata['password'] = $new_password; file_put_contents($meta_path, json_encode($metadata)); return true; } return false; } // Get list of uploaded sites for current user $uploaded_sites = []; $total_size = 0; if (is_dir($user_dir)) { $files = scandir($user_dir); foreach ($files as $file) { if ($file !== '.' && $file !== '..' && !str_ends_with($file, '.json')) { $file_path = $user_dir . '/' . $file; if (is_dir($file_path)) { // Handle directory (ZIP extracted sites) $html_files = glob($file_path . '/*.{html,htm}', GLOB_BRACE); if (!empty($html_files)) { $site_name = $file; $meta_path = $user_dir . '/' . $site_name . '.json'; $metadata = file_exists($meta_path) ? json_decode(file_get_contents($meta_path), true) : []; $uploaded_sites[] = [ 'name' => $site_name, 'filename' => $file, 'url' => getWebsiteUrl($site_name, $user_id), 'time' => filemtime($file_path), 'size' => getDirectorySize($file_path), 'type' => 'zip', 'is_dir' => true, 'has_password' => !empty($metadata['password']), 'metadata' => $metadata ]; $total_size += getDirectorySize($file_path); } } else { // Handle single files $file_ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); // Only show allowed file types if (in_array($file_ext, ['html', 'htm', 'css', 'js'])) { $site_name = pathinfo($file, PATHINFO_FILENAME); $meta_path = $user_dir . '/' . $site_name . '.json'; $metadata = file_exists($meta_path) ? json_decode(file_get_contents($meta_path), true) : []; $uploaded_sites[] = [ 'name' => $site_name, 'filename' => $file, 'url' => getWebsiteUrl($site_name, $user_id), 'time' => filemtime($file_path), 'size' => filesize($file_path), 'type' => $file_ext, 'is_dir' => false, 'has_password' => !empty($metadata['password']), 'metadata' => $metadata ]; $total_size += filesize($file_path); } } } } // Sort by newest first usort($uploaded_sites, function($a, $b) { return $b['time'] - $a['time']; }); } // Get directory size recursively function getDirectorySize($path) { $total_size = 0; $files = scandir($path); foreach ($files as $file) { if ($file !== '.' && $file !== '..') { $file_path = $path . '/' . $file; if (is_file($file_path)) { $total_size += filesize($file_path); } elseif (is_dir($file_path)) { $total_size += getDirectorySize($file_path); } } } return $total_size; } // Convert bytes to human readable format function formatSize($bytes) { if ($bytes == 0) return '0 B'; $units = ['B', 'KB', 'MB', 'GB']; $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); $bytes /= pow(1024, $pow); return round($bytes, 2) . ' ' . $units[$pow]; } ?> TF DEV | FREE HOSTING

TF HOSTING

TF DEV HOSTING

PREMIUM FREE SYSTEM

ID: ...
Deploy Project
Upload File
Code Editor
Preview

Click to Select File

HTML, CSS, JS, ZIP supported

Total Sites

Storage Used

Your Hosted Projects
Open

No Projects Yet

Upload your first HTML/ZIP file to see it here.