File Information
| File Name | = htmlspecialchars($fileName) ?> |
|---|---|
| File Type | = htmlspecialchars(strtoupper($fileExtension)) ?> |
| File Size | = formatBytes($fileSize) ?> |
connect_error) { die("Connection failed: " . $conn->connect_error); } return $conn; } if (!isset($_GET['token'])) { die("Invalid request. No token provided."); } $token = $_GET['token']; $conn = getDatabaseConnection(); // Get share information $stmt = $conn->prepare("SELECT * FROM share WHERE token = ? AND expiration > NOW()"); $stmt->bind_param("s", $token); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows === 0) { die("Invalid or expired share link."); } $share = $result->fetch_assoc(); $filePath = $share['file_path']; $downloadAllowed = $share['download_allowed'] == 1; $stmt->close(); // Initialize SFTP $sftp = initializeSFTP($host, $username, $password); if (!$sftp->stat($filePath)) { die("File not found: $filePath"); } $fileName = basename($filePath); $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); $fileSize = $sftp->stat($filePath)['size']; $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"); } $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 streaming requested, stream file if (isset($_GET['stream'])) { // Similar streaming code as in view.php session_write_close(); while (ob_get_level()) { ob_end_clean(); } if (ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); } $start = 0; $end = $fileSize - 1; $length = $fileSize; 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); } } 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"); set_time_limit(0); $minChunkSize = 64 * 1024; $maxChunkSize = 2 * 1024 * 1024; $chunkSize = 256 * 1024; $currentPosition = $start; $bytesRemaining = $length; $lastChunkTime = microtime(true); try { while ($bytesRemaining > 0) { if (connection_aborted() || connection_status() !== CONNECTION_NORMAL) { break; } $readSize = min($chunkSize, $bytesRemaining); $chunkData = $sftp->get($filePath, false, $currentPosition, $readSize); if ($chunkData !== false) { $bytesSent = strlen($chunkData); echo $chunkData; $bytesRemaining -= $bytesSent; $currentPosition += $bytesSent; if (ob_get_level()) { ob_flush(); } flush(); $currentTime = microtime(true); $timeDiff = $currentTime - $lastChunkTime; $lastChunkTime = $currentTime; if ($timeDiff > 0) { $speed = $bytesSent / $timeDiff; $chunkSize = min( max($minChunkSize, $chunkSize * (($speed > 512 * 1024) ? 1.5 : 0.8)), $maxChunkSize ); } } else { break; } usleep(100000); } } catch (Exception $e) { error_log("Shared streaming error: " . $e->getMessage()); } exit; } // Create download handler if (isset($_GET['download'])) { if (!$downloadAllowed) { die("Download not permitted for this share."); } // Download file code similar to download.php header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"$fileName\""); header("Content-Length: $fileSize"); $minChunkSize = 64 * 1024; $maxChunkSize = 2 * 1024 * 1024; $chunkSize = 256 * 1024; $currentPosition = 0; $bytesRemaining = $fileSize; set_time_limit(0); while ($bytesRemaining > 0) { $readSize = min($chunkSize, $bytesRemaining); $chunkData = $sftp->get($filePath, false, $currentPosition, $readSize); if ($chunkData !== false) { $bytesRead = strlen($chunkData); echo $chunkData; $bytesRemaining -= $bytesRead; $currentPosition += $bytesRead; flush(); } else { break; } } exit; } function formatBytes($bytes, $precision = 2) { $units = ['B', 'KB', 'MB', 'GB', 'TB']; $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); $bytes /= (1 << (10 * $pow)); return round($bytes, $precision) . ' ' . $units[$pow]; } ?>
This link will expire on = date('F j, Y, g:i a', strtotime($share['expiration'])) ?>
| File Name | = htmlspecialchars($fileName) ?> |
|---|---|
| File Type | = htmlspecialchars(strtoupper($fileExtension)) ?> |
| File Size | = formatBytes($fileSize) ?> |