prepare("INSERT INTO share (token, file_path, expiration, download_allowed) VALUES (?, ?, ?, ?)"); $stmt->bind_param("sssi", $token, $filePath, $expiration, $downloadAllowed); if ($stmt->execute()) { $shareUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]" . dirname($_SERVER['PHP_SELF']) . "/shared.php?token=$token"; $_SESSION['shareCreated'] = true; $_SESSION['shareUrl'] = $shareUrl; $_SESSION['shareExpiration'] = $expiration; header("Location: view.php?file=" . urlencode($filePath) . "&shared=1"); exit; } else { $_SESSION['shareError'] = "Failed to create share: " . $conn->error; header("Location: view.php?file=" . urlencode($filePath) . "&shared=0"); exit; } $stmt->close(); $conn->close(); } $shareCreated = false; $shareUrl = ''; $shareExpiration = ''; $shareError = ''; if (isset($_GET['shared'])) { if ($_GET['shared'] == '1' && isset($_SESSION['shareCreated']) && $_SESSION['shareCreated']) { $shareCreated = true; $shareUrl = $_SESSION['shareUrl']; $shareExpiration = $_SESSION['shareExpiration']; } elseif ($_GET['shared'] == '0' && isset($_SESSION['shareError'])) { $shareError = $_SESSION['shareError']; } } function getDatabaseConnection() { $servername = "localhost:3306"; $username = "UNAME"; $password = "PSWD"; $db = "usbraidlogin"; $conn = new mysqli($servername, $username, $password, $db); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } return $conn; } $filePath = $_GET['file']; $fileName = basename($filePath); $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); if (!$sftp->stat($filePath)) { die("File not found: $filePath"); } $imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg']; $videoTypes = ['mp4', 'webm', 'ogg', 'mov', 'avi', 'mkv']; $audioTypes = ['mp3', 'wav', 'ogg', 'm4a', 'flac', 'aac']; $isImage = in_array($fileExtension, $imageTypes); $isVideo = in_array($fileExtension, $videoTypes); $isAudio = in_array($fileExtension, $audioTypes); if (!$isImage && !$isVideo && !$isAudio) { die("Unsupported file type"); } $fileSize = $sftp->stat($filePath)['size']; $mimeMap = [ 'mp4' => 'video/mp4', 'webm' => 'video/mp4', 'ogg' => 'video/mp4', 'mov' => 'video/mp4', 'avi' => 'video/mp4', 'mkv' => 'video/mp4', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'webp' => 'image/webp', 'svg' => 'image/svg+xml', 'mp3' => 'audio/mpeg', 'wav' => 'audio/wav', 'm4a' => 'audio/mp4', 'flac' => 'audio/flac', 'aac' => 'audio/aac', ]; $mimeType = isset($mimeMap[$fileExtension]) ? $mimeMap[$fileExtension] : 'application/octet-stream'; if (isset($_GET['stream'])) { // Close session to allow other scripts to run session_write_close(); // Prevent output buffering while (ob_get_level()) { ob_end_clean(); } // Disable output compression if (ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); } // Initialize range variables $start = 0; $end = $fileSize - 1; $length = $fileSize; // Handle range requests if (isset($_SERVER['HTTP_RANGE'])) { $rangeHeader = $_SERVER['HTTP_RANGE']; $matches = []; if (preg_match('/bytes=(\d+)-(\d*)/', $rangeHeader, $matches)) { $start = intval($matches[1]); if (!empty($matches[2])) { $end = intval($matches[2]); } $length = $end - $start + 1; header('HTTP/1.1 206 Partial Content'); header('Content-Range: bytes ' . $start . '-' . $end . '/' . $fileSize); } } // Set headers for streaming header("Content-Type: $mimeType"); header("Accept-Ranges: bytes"); header("Content-Length: $length"); header("Cache-Control: no-cache, no-store, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); // Debug headers if (isset($_GET['debug'])) { header("X-Stream-Info: Chunked SFTP Streaming"); header("X-File-Path: " . basename($filePath)); header("X-File-Size: $fileSize"); } // Set timeout to 0 to prevent script termination set_time_limit(0); // Chunk settings $minChunkSize = 64 * 1024; // 64KB minimum $maxChunkSize = 2 * 1024 * 1024; // 2MB maximum $chunkSize = 256 * 1024; // Start with 256KB $currentPosition = $start; $bytesRemaining = $length; $lastChunkTime = microtime(true); try { while ($bytesRemaining > 0) { // Check client connection and server status if (connection_aborted() || connection_status() !== CONNECTION_NORMAL) { if (isset($_GET['debug'])) { error_log("Client disconnected at position $currentPosition"); } break; } // Calculate adaptive chunk size $readSize = min($chunkSize, $bytesRemaining); // Get chunk from SFTP $chunkData = $sftp->get($filePath, false, $currentPosition, $readSize); if ($chunkData !== false) { $bytesSent = strlen($chunkData); // Output chunk echo $chunkData; $bytesRemaining -= $bytesSent; $currentPosition += $bytesSent; // Flush buffers if (ob_get_level()) { ob_flush(); } flush(); // Adaptive chunk sizing based on transfer speed $currentTime = microtime(true); $timeDiff = $currentTime - $lastChunkTime; $lastChunkTime = $currentTime; if ($timeDiff > 0) { $speed = $bytesSent / $timeDiff; // bytes/second $chunkSize = min( max($minChunkSize, $chunkSize * (($speed > 512 * 1024) ? 1.5 : 0.8)), $maxChunkSize ); } if (isset($_GET['debug'])) { header("X-Chunk-Size: $bytesSent"); header("X-Position: $currentPosition"); header("X-Remaining: $bytesRemaining"); } } else { error_log("SFTP read error at position $currentPosition"); break; } // Throttle to prevent CPU overload usleep(100000); // 100ms } } catch (Exception $e) { error_log("Streaming error: " . $e->getMessage()); if (isset($_GET['debug'])) { header("X-Stream-Error: " . $e->getMessage()); } } if (isset($_GET['debug'])) { error_log("Streaming completed. Sent $currentPosition bytes of $fileSize"); } exit; } ?> Media Viewer - <?= htmlspecialchars($fileName) ?>

Media Viewer

<?= htmlspecialchars($fileName) ?>
Note: For best results, use MP4 format (H.264 codec). Other formats may not play correctly in all browsers.
Download

Share link created successfully!

This link will expire on

File Information

File Name
File Type
MIME Type
File Size