'video/mp4', 'webm' => 'video/webm', 'ogg' => 'video/ogg', 'mov' => 'video/quicktime' ]; $mime_type = $mime_types[$extension] ?? 'video/mp4'; // Gestisci Range Request per supportare seek nel video $start = 0; $end = $file_size - 1; $length = $file_size; if (isset($_SERVER['HTTP_RANGE'])) { $range = $_SERVER['HTTP_RANGE']; if (preg_match('/bytes=(\d+)-(\d*)/', $range, $matches)) { $start = intval($matches[1]); if (!empty($matches[2])) { $end = intval($matches[2]); } $length = $end - $start + 1; http_response_code(206); // Partial Content } } else { http_response_code(200); } // Invia header header("Content-Type: $mime_type"); header("Accept-Ranges: bytes"); header("Content-Length: $length"); header("Content-Range: bytes $start-$end/$file_size"); // Header per impedire il download e la cache aggressiva header("Content-Disposition: inline; filename=\"video.{$extension}\""); header("X-Content-Type-Options: nosniff"); // Header di cache per migliorare le performance header("Cache-Control: public, max-age=3600"); header("Pragma: public"); // Apri e leggi il file $fp = fopen($file, 'rb'); fseek($fp, $start); $buffer = 1024 * 8; // 8KB buffer while (!feof($fp) && ($pos = ftell($fp)) <= $end) { if ($pos + $buffer > $end) { $buffer = $end - $pos + 1; } echo fread($fp, $buffer); flush(); } fclose($fp); exit;